国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

輕松理解Python 中的 descriptor

2020-02-16 10:16:20
字體:
來源:轉載
供稿:網友

定義

通常,一個 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

總結

以上所述是小編給大家介紹的Python 中的 descriptor,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林站長站網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 电白县| 沂源县| 永春县| 桃园县| 饶河县| 山东省| 东方市| 武隆县| 宜黄县| 饶阳县| 鲜城| 大足县| 无为县| 高雄市| 海门市| 齐河县| 南充市| 永和县| 沙湾县| 新乡市| 黎平县| 阿鲁科尔沁旗| 湘西| 蒙自县| 阜平县| 临夏市| 姜堰市| 五河县| 兴业县| 易门县| 大冶市| 松潘县| 明星| 习水县| 龙口市| 开封县| 长治县| 三门县| 崇阳县| 乳源| 肃宁县|