標籤:ini val 注釋 instance === 描述 UNC delete 屬性
描述符使用
Foo接管了Bar的x值,當x值被操作的時候都調用Foo相應的get/set/delete操作
class Foo: def __get__(self,instance,owner): print(‘===>get‘,instance,owner) def __set__(self,instance,value): print(‘===>set‘,instance,value) def __delete__(self, instance): print(‘===>delete‘,instance)class Bar: x = Foo() def __init__(self,n): self.x = nb1 = Bar(10)print(b1.__dict__)print(Bar.__dict__)print(b1.x)‘‘‘===>set <__main__.Bar object at 0x0000022A4A214D68> 10{}{‘__module__‘: ‘__main__‘, ‘x‘: <__main__.Foo object at 0x0000022A4A214C50>, ‘__init__‘: <function Bar.__init__ at 0x0000022A4A1F6C80>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Bar‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Bar‘ objects>, ‘__doc__‘: None}===>get <__main__.Bar object at 0x0000022A4A214D68> <class ‘__main__.Bar‘>None‘‘‘
class Foo: def __get__(self,instance,owner): print(‘===>get‘,instance,owner) def __set__(self,instance,value): print(‘===>set‘,instance,value) def __delete__(self, instance): print(‘===>delete‘,instance)class Bar: x = Foo() def __init__(self,n): self.x = n# print(Bar.x)# Bar.x = 1 #不觸發描述符,因為類屬性優先順序更高,如果不注釋,後面的語句也不觸發描述符b1 = Bar(10)print(b1.x)del b1.x‘‘‘===>set <__main__.Bar object at 0x000001D368C14CF8> 10===>get <__main__.Bar object at 0x000001D368C14CF8> <class ‘__main__.Bar‘>None===>delete <__main__.Bar object at 0x000001D368C14CF8>‘‘‘
描述符優先順序
- 類屬性
- 資料描述符
- 執行個體屬性
- 非資料描述符
- 找不到的屬性觸發__getattr__()
class Foo: def __get__(self,instance,owner): print(‘===>get‘,instance,owner) def __set__(self,instance,value): print(‘===>set‘,instance,value) def __delete__(self, instance): print(‘===>delete‘,instance)class Bar: x = Foo() def __init__(self,n): self.x = n# print(Bar.x)Bar.x = 1 #不觸發描述符,因為類屬性優先順序更高‘‘‘Process finished with exit code 0‘‘‘
物件導向-描述符