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

首頁 > 編程 > Python > 正文

輕松理解Python 中的 descriptor

2020-01-04 16:45:27
字體:
供稿:網(wǎng)友

定義

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

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

Descriptor 是一個(gè)強(qiáng)大的工具,雖然開發(fā)者不常接觸到它,但它其實(shí)就是類、屬性、函數(shù)、方法、靜態(tài)方法、類方法以及 super() 背后的運(yùn)行機(jī)制。

Descriptor 協(xié)議

三個(gè)方法原型如下所示:

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

數(shù)據(jù) descriptor 是同時(shí)具有 __get__() 和 __set__() 方法的對(duì)象,若只有 __get__() 方法,則為非數(shù)據(jù) descriptor。如果實(shí)例字典中有和數(shù)據(jù) descriptor 同名的入口,則數(shù)據(jù) descriptor 優(yōu)先級(jí)更高。相反,非數(shù)據(jù) descriptor 優(yōu)先級(jí)低。

讓 __set__() 方法拋出異常,就能創(chuàng)建一個(gè)只讀數(shù)據(jù) descriptor。

調(diào)用 descriptor

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

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

對(duì)于對(duì)象, b.x 會(huì)被轉(zhuǎn)換成 type(b).__dict__['x'].__get__(b, type(b)) 。而對(duì)于類(是的,類也可以調(diào)用), B.x 會(huì)被轉(zhuǎn)換成 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

總結(jié)

以上所述是小編給大家介紹的Python 中的 descriptor,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 广安市| 双桥区| 句容市| 剑川县| 青铜峡市| 镇安县| 类乌齐县| 颍上县| 个旧市| 黄平县| 阿拉善右旗| 湘阴县| 中宁县| 舒兰市| 邢台县| 油尖旺区| 红河县| 达州市| 扎兰屯市| 姚安县| 巫溪县| 金平| 舞阳县| 临湘市| 新野县| 巴塘县| 疏附县| 嘉荫县| 江津市| 张家港市| 江油市| 磐石市| 洛川县| 乐平市| 襄垣县| 海兴县| 资阳市| 瓦房店市| 松阳县| 内黄县| 淅川县|