Python中descriptor的詳細介紹

來源:互聯網
上載者:User
本文給大家分Python 中的 descriptor相關知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

定義

通常,一個 descriptor 是具有“綁定行為”的對象屬性。所綁定行為可通過 descriptor 協議被自訂的 __get__() , __set__() 和 __delete__() 方法重寫。如果一個對象的上述三個方法任意一個被重寫,則就可被稱為 descriptor。

屬性的預設操作是從對象字典中擷取、設定和刪除一個屬性。例如,a.x 有一個尋找鏈,先 a.__dict__['x'] ,若沒有則 type(a).__dict__['x'] ,若沒有增往上尋找父類直到元類。如果尋找鏈中,對象被定義了 descriptor 方法,Python 就會覆蓋預設行為。

Descriptor 是一個強大的工具,雖然開發人員不常接觸到它,但它其實就是類、屬性、函數、方法、靜態方法、類方法以及 super() 背後的運行機制。

Descriptor 協議

三個方法原型如下所示:


descr.__get__(self, obj, type=None) --> valuedescr.__set__(self, obj, value) --> Nonedescr.__delete__(self, obj) --> None

資料 descriptor 是同時具有 __get__() 和 __set__() 方法的對象,若只有 __get__() 方法,則為非資料 descriptor。如果執行個體字典中有和資料 descriptor 同名的入口,則資料 descriptor 優先順序更高。相反,非資料 descriptor 優先順序低。

讓 __set__() 方法拋出異常,就能建立一個唯讀資料 descriptor。

調用 descriptor

descriptor 可以直接通過方法名調用。例如, d.__get__(obj) 。

而通過訪問對象屬性,自動調用 descriptor 才是更通用的做法。例如,如果 d 定義了方法 __get__() ,則 obj.d 會調用 d.__get__(obj) 。

對於對象, b.x 會被轉換成 type(b).__dict__['x'].__get__(b, type(b)) 。而對於類(是的,類也可以調用), B.x 會被轉換成 B.__dict__['x'].__get__(None, B) 。

Descriptor 例子


class RevealAccess(object):  """A data descriptor that sets and returns values    normally and prints a message logging their access.  """  def __init__(self, initval=None, name='var'):    self.val = initval    self.name = name  def __get__(self, obj, objtype):    print('Retrieving', self.name)    return self.val  def __set__(self, obj, val):    print('Updating', self.name)    self.val = val>>> class MyClass(object):...   x = RevealAccess(10, 'var "x"')...   y = 5...>>> m = MyClass()>>> m.xRetrieving var "x"10>>> m.x = 20Updating var "x">>> m.xRetrieving var "x"20>>> m.y5
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.