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 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。