自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room:
def __init__(self,name):
self.name = name
def big_room(self):
print('bigroot')
def __getattr__(self, item):
print('调用一个不存的对象属性时候,执行',item)
def __delattr__(self, item):
print('删除一个属性时候,执行',item)
def __setattr__(self, key, value):
print('设置一个属性操作的时候,执行')
self.__dict__[key] = value
print(key,value)
#self.key = value #这些写会报错递归 RecursionError: maximum recursion depth exceeded 因为这个也是在设置一个属性,当设置这个属性的时候,也会触发__setattr__,这样就会一直循环,最后报错,所有使用self.__dict__[key] = value操作
def __getattribute__(self, item):
print('只要运行,我就执行',item) #只要执行调用,我就执行
R = Room('回电话') #设置一个属性操作的时候,执行__setattr__; __init__中的self.name 传递给key name 传递给value
R.ddddddd #调用这个对象属性不存在,就执行__getattr__ 属性,不要加括号 ddddddd 这个参数会传递给item
del R.yiii #删除的时候会触发__delattr__ 不管删除的这个属性是否存在 都触发 yiii 这个参数会传递给item
print(R.__dict__)
Room.txt = 2 #无法触发__setattr__
执行结果:
设置一个属性操作的时候,执行
name 回电话
调用一个不存的对象属性时候,执行 ddddddd
删除一个属性时候,执行 yiii
{'name': '回电话'}
注意: __getattr__ __delattr__ __setattr__ 触发条件是实例化后才能触发