Python進階-----描述符(__get__(),__set__(),__delete__())
阿新 • • 發佈:2018-11-02
一、描述符是什麼
描述符本質就是一個新式類,在這個新式類中,至少實現了__get__(),__set__(),__delete__()中的一個,這也被稱為描述符協議
__get__():呼叫一個屬性時,觸發
__set__():為一個屬性賦值時,觸發
__delete__():採用del刪除屬性時,觸發
1 class Foo: #在python3中Foo是新式類,它實現了三種方法,這個類就被稱作一個描述符 2 def __get__(self, instance, owner): 3 print('__get__(),被執行了') 4 def__set__(self, instance, value): 5 print('__set__(),被執行了') 6 def __delete__(self, instance): 7 print('__delete__(),被執行了')
二、描述符的作用
描述符的作用是用來代理另外一個類的屬性的(必須把描述符定義成這個類的類屬性,不能定義到建構函式中)
1 class Test: 2 x = Foo() 3 def __init__(self,x): 4 self.x = x 5 6 t = Test(2) #'__set__(),被執行了' 7 print(t.x) #'__get__(),被執行了' 'None'
三、描述符分為兩種
1、資料描述符:至少實現了__get__()和__set__()
2、非資料描述符:沒有實現__set__()
1 #資料描述符 2 class Foo: 3 def __set__(self, instance, value): 4 print('set') 5 def __get__(self, instance, owner): 6 print('get')7 8 #非資料描述符 9 class Foo: 10 def __get__(self, instance, owner): 11 print('get')
四、注意事項:
描述符本身應該定義成新式類,被代理的類也應該是新式類
必須把描述符定義成這個類的類屬性,不能為定義到建構函式中
要嚴格遵循該優先順序,優先順序由高到底分別是
1類屬性
2資料描述符
3例項屬性
4非資料描述符
5找不到的屬性觸發__getattr__()