attr方法笔记(反射)

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

原文地址:https://www.cnblogs.com/RainBol/p/10084142.html