1. 自定义属性访问
    2. 1.__getattr__
    3. 作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。
    4. 2.__getattribute__
    5. 作用:访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError
    6. 总结:当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__
    7. 如果属性存在,就返回这个属性值,如果没有就报 AttrError
    8. 3. __setattr__(self,key,value)
    9. 作用:这个属性在给对象设置属性的时候触发
    10. 例子:
    11. def __setattr__(self,key,value):
    12.   if key == "age" :
    13.   super().__setattr__(key,18)
    14.   else:
    15.   print("设置属性的时候会触发")
    16.   super().__setattr__(key,value)
    17. 4. __delattr__(self,item):
    18.   print("删除的时候被触发")
    19.   super().__delattr__(item)
    20.   item : 被删除的类属性名
    21. 作用:如果我们不想一个属性被删除,就重写__delattr__方法,如果调用父类的方法就会被删除
    22. 二、描述器
    23. 描述器是一个具有"绑定行为"的对象属性,该对象的属性访问通过描述器协议覆盖:__get__()
    24. __set__()和__delete__().如果一个对象定义这些方法中的任何一个,它被称为一个描述器。
    25. 1.object.__get__(self,instance,owner)
    26. 获取主类的属性或者该类的一个实例的属性。owner始终是属主,instance是属性访问的实例
    27. 当属性通过owner访问时则为None。这个方法该返回的属性值,或者引发一个AttributeError
    28. 异常
    29. 2.object.__set__(self,instance,value)
    30. 设置属主类的实例instance的属性为一个新值value
    31. 3.object.__delete__(self,instance)
    32. 删除属主类的实例insta的属性
    33. 例子:
    34. class Filed(object):
    35.   def __get__(self,instance,owner)
    36.   print("访问属性的时候被触发")
    37.   return self.value
    38. def object.__set__(self,instance,value)
    39.   print("set方法被触发")
    40.   self.value = value
    41. def object.__delete__(self,instance)
    42.   print("删除属性的时候被触发")
    43.   self.value = None
    44. class Model(object):
    45. name = '熊猫'
    46. attr = Filed() # 描述器对象:会覆盖类属性的相关操作