1. 程式人生 > >Python進階-----描述符(__get__(),__set__(),__delete__())

Python進階-----描述符(__get__(),__set__(),__delete__())

一、描述符是什麼
  描述符本質就是一個新式類,在這個新式類中,至少實現了__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__()