__getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

自己定义了这些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__ 触发条件是实例化后才能触发

 

 

原文地址:https://www.cnblogs.com/ajaxa/p/9051951.html