1.描述符
描述符是一个新式类,凡是类中含有get,set,delete这三种方法之一的类都可以称之为描述符
其中,至少含有get和set的称之为数据描述符,仅含有get方法的称之为非数据描述符
1.1 描述符的作用
描述符
class Test: def __set__(self, instance, value):#instance就是实例,value是方法 print(instance) print(value) def __get__(self, instance, owner): print(instance) print(owner)#这个就是类 print('this is get') def __delete__(self, instance): print(instance) class Fun: name=Test()#用描述符来代理name p1=Fun() p1.name#调用name,会到Test里面去找get方法 p1.name='ggg'#调用set方法 del p1.name === <__main__.Fun object at 0x000002C11B37CEF0> <class '__main__.Fun'> this is get <__main__.Fun object at 0x000002C11B37CEF0> ggg <__main__.Fun object at 0x000002C11B37CEF0>
1.2 描述符的优先级
getattribute
类属性
数据描述符
实例属性
非数据描述符
getattr
依次进行按顺序选取
1.2.1 类属性与数据描述符的比较
class Test: # def __set__(self, instance, value):#instance就是实例,value是方法 # print(instance) # print(value) # print('set') def __get__(self, instance, owner): # print(instance) # print(owner)#这个就是类 print('get') # def __delete__(self, instance): # print(instance) print('del') class Fun: name = Test() def __getattr__(self, item): print('getattr') # print(Fun.name)#比较类属性和实例属性选择哪一个 # print(Fun.__dict__) # Fun.name=1#如果数据描述符优先级比较高的话,应该调用set,但是直接调用了类属性 # print(Fun.name) #数据描述符和实例属性比较 p1=Fun() # p1.name=18#正常的话会直接写入到字典里 # print(p1.__dict__)#但是字典中什么都没有,所以被代理了 #只剩下get成为非数据描述符之后,实例属性在前面 p1.xzzxxxx#找不到就直接出发getattr