一 、 自定义属性访问1.__getattr__ 作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。2.__getattribute__ 作用:访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError总结:当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__ 如果属性存在,就返回这个属性值,如果没有就报 AttrError3. __setattr__(self,key,value)作用:这个属性在给对象设置属性的时候触发例子:def __setattr__(self,key,value):  if key == "age" :  super().__setattr__(key,18)  else:  print("设置属性的时候会触发")  super().__setattr__(key,value)4. __delattr__(self,item):  print("删除的时候被触发")  super().__delattr__(item)  item : 被删除的类属性名作用:如果我们不想一个属性被删除,就重写__delattr__方法,如果调用父类的方法就会被删除二、描述器描述器是一个具有"绑定行为"的对象属性,该对象的属性访问通过描述器协议覆盖:__get__() __set__()和__delete__().如果一个对象定义这些方法中的任何一个,它被称为一个描述器。1.object.__get__(self,instance,owner)获取主类的属性或者该类的一个实例的属性。owner始终是属主,instance是属性访问的实例当属性通过owner访问时则为None。这个方法该返回的属性值,或者引发一个AttributeError异常2.object.__set__(self,instance,value)设置属主类的实例instance的属性为一个新值value3.object.__delete__(self,instance)删除属主类的实例insta的属性例子:class Filed(object):  def __get__(self,instance,owner)  print("访问属性的时候被触发")  return self.valuedef object.__set__(self,instance,value)  print("set方法被触发")  self.value = valuedef object.__delete__(self,instance)  print("删除属性的时候被触发")  self.value = Noneclass Model(object):name = '熊猫'attr = Filed() # 描述器对象:会覆盖类属性的相关操作