attr方法笔记

  attr中用到了四个内置面向对象方法(__getattr__,__setattr__,__hasattr__,__delattr__),这称为反射,由于python中一切皆对象,反射可以任意的根据字符串形式取对象中获取/修改/删除成员

  对象的属性可能来自于其类定义,叫做类属性(class attribute)。

  类属性可能来自类定义自身,也可能根据类定义继承来的。

  一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)

class test() :
username = 'username值'
def hhh(self):
return '运行我'
def a(self):
return 1
p = test()
hasattr(object, name)
#hasattr(object, name)
print(hasattr(p,'username'))#判断一个对象中是否有其参数一样的类属性或者类方法,返回布尔值,hasattr方法在项目中使用较少因为直接可以用getattr(p,None)来代替
print(hasattr(p,'hhh'))
getattr(object, name[,default])
print(getattr(p,'username'))#获取一个对象中方法或者属性,参数为函数名或者变量名,使用getattr需要保证的是函数或者变量存在,不然会报错
print(getattr(p,'username')) print(getattr(p,'hhh'))#打印<bound method test.hhh of <__main__.test object at 0x0000000002564080>>
#getattr(p,'2222') #AttributeError: 'test' object has no attribute '2222'
getattr(p,'hhh')()#再加括号表示运行
print(getattr(p,'password',p.hhh()))#为了避免报错,如果找不到函数或者变量可以在后面再加上一个参数值,若不存在则返回默认变量
print(getattr(p,'password',p.hhh(),None))#None表示为空,不做处理
setattr(object, name, values)
#给对象的属性赋值,若属性不存在,先创建再赋值。
print(hasattr(p,'password'))#返回的一定是false
print(setattr(p,'password',test.username))#给password赋予username同样的属性
print(p.username)
print(p.password)#虽然pycharm报错了但是我们仍然可以运行,也就是说我们也可以通过这种办法给函数或者变量赋值 print(hasattr(p,'hhh'))
print(getattr(p,'cc',setattr(p,'cc',p.a())))
print(getattr(p,'cc'))#这样就生成了一个cc函数并且和a一样方法

setattr应用

#这样可以理解成a方法,hhh方法,调用一个a时,如果没有调用成功,把hhh方法变成a方法,继续运行a方法而不用大批量修改方法名
if getattr(p, "c", None) is None:
setattr(p, "c", p.hhh())
a = getattr(p, "c")

delattr(object,name)

#函数作用用来删除指定对象的指定名称的属性,和setattr函数作用相反
#删除属性 class Test:
def __init__(self,name):
self.name = name
aaa = 'aaa'
def bbb(self):
print(self.name)
delattr(test,'aaa')
print("删除aaa成功应该返回False:",hasattr(test,'aaa'))#删除成功返回false
#delattr(test,'name')没有实例化之前不能删除构造函数中的变量,直接报错
c = test(1)#实例化,下面是实例化之后的测试 #delattr(c,'ssd')#删除不存在的变量也会报错
delattr(c,'name')#用对象来删除变量
print("实例化之后可以直接删除构造函数中的变量",hasattr(c,'name'))#删除成功,返回False
#在引用name报错说明删除成功
#print(c.name)# AttributeError: 'test' object has no attribute 'name'
#不能删除方法
#delattr(c,'bbb')#AttributeError: bbb,但是不能删除对象的方法

内建sttr方法

# __setattr__:
# 当设置对象的属性时会触发,比如self.name = name,有几次赋值会触发几次运行,或者setattr()被调用时也会触发__setattr__。
#
# __delattr__:
# 当删除对象属性时会触发,比如del p.name或者调用delattr()时也会触发__delattr__。
#
# __getattr__:
# 此内置方法比较特殊,当对象的属性不存在时会触发执行__getattr__。

__getattribute__  属性访问拦截器  

  常用于权限,日志

  参考:

https://www.cnblogs.com/blackmatrix/p/5681480.html

https://blog.csdn.net/yitiaodashu/article/details/78974596

版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

attr方法笔记(反射)的更多相关文章

  1. jquery中prop()方法和attr()方法的区别

    最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...

  2. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  3. jquery中prop()方法和attr()方法

    接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...

  4. jquery attr()方法

    在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^ jque ...

  5. jQ中对attr()方法的理解

    在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^jquer ...

  6. jQuery中attr()方法用法实例

    本文实例讲述了jQuery中attr()方法用法.分享给大家供大家参考.具体分析如下: 此方法设置或返回匹配元素的属性值. attr()方法根据参数的不同,功能也不同. 语法结构一: 获取第一个匹配元 ...

  7. jquery attr()方法 添加,修改,获取对象的属性值。

    jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...

  8. Jquery attr()方法 属性赋值和属性获取

    jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1. attr(属性名 ...

  9. jquery 的attr()方法解析

    我想用jquery的attr()方法修改一个li小圆点的背景颜色和外边框的时候:刚开始 $("#shanghai-btn").attr({background:"#999 ...

随机推荐

  1. Django时区导致的datetime时间比较报错

    我们使用python 的datetime模块比较Django数据库Datetime字段的时候,可能会出现报错: TypeError: can't compare offset-naive and of ...

  2. windows下大数据开发环境搭建(3)——Scala环境搭建

    一.所需环境 ·Java 8   二.下载Scala https://www.scala-lang.org/download/ 三.配置环境变量 SCALA_HOME: C:\scala Path: ...

  3. Python 环境搭建(Win 安装以及Mac OS 安装)

    千里之行始于足下,今天我们先来学习 Python 环境搭建. 注意:本系列教程基于 Python 3.X Python 环境搭建 Win 安装 打开 Python 官网 https://www.pyt ...

  4. [CF9D]How Many Trees?_动态规划_树形dp_ntt

    How many trees? 题目链接:https://www.codeforces.com/contest/9/problem/D 数据范围:略. 题解: 水题. $f_{i,j}$表示$i$个节 ...

  5. Ribbon学习笔记

    微服务的概念: Ribbon默认的是轮询的算法:   @LoadBalanced @EnableEurekaClient Irule是根据 Ribbon默认(轮询)的7中负载均衡的算法: 修改默认的R ...

  6. 019 Android 形状可绘制对象(根据要求绘制图片)+图片选择器

    1.目标效果 绘制颜色渐变的图片 2.实现方法 (1)在app--->res--->drawable 右击drawable文件夹右键,new ---->drawable resour ...

  7. java微服务的统一配置中心

    为了更好的管理应用的配置,也为了不用每次更改配置都重启应用,我们可以使用配置中心 关于eureka的服务注册和rabbitMQ的安装使用(自动更新配置需要用到rabbitMQ)这里不赘述,只关注配置中 ...

  8. (7)Spring Boot web开发 --- servlet容器

    文章目录 配置嵌入式 Servlet 容器 注册 三大组件 使用其他 servlet 容器 使用外置的 `Servlet` 容器 配置嵌入式 Servlet 容器 Spirng Boot 默认使用自带 ...

  9. 学习makefile 的网址

    http://www.ruanyifeng.com/blog/2015/02/make.html http://blog.csdn.net/ruglcc/article/details/7814546 ...

  10. 剑指offer64:滑动窗口的最大值

    1 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4 ...