亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

輕松理解Python 中的 descriptor

系統 1535 0

定義

通常,一個 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) --> value
descr.__set__(self, obj, value) --> None
descr.__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.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
          

總結

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久综合伊人77777 | 国产日韩欧美一区二区三区综合 | 亚洲成人在线视频观看 | 色www精品视频在线观看 | 最新69成人精品毛片 | 欧美日韩国产一区二区三区 | 九九热香蕉视频 | 国产精品久久香蕉免费播放 | 加勒比黑人在线 | 欧美区一区 | 久久在精品线影院精品国产 | 国产99在线播放 | 久久综合图区亚洲综合图区 | 欧美一级毛片久久精品 | 欧美日韩国产片 | 亚洲综合精品香蕉久久网97 | 搜索一级毛片 | 春色www在线视频观看 | 国产免费不卡v片在线观看 国产免费不卡视频 | 91婷婷色| 久久国产精品范冰啊 | 欧美日本亚洲国产一区二区 | 色老头久久久久久久久久 | 日韩专区亚洲精品欧美专区 | 一级日韩 | 国产在线伊人 | 青青草国产一区二区三区 | 狠狠色噜噜狠狠狠狠米奇777 | 日日好 | 四虎影视永久在线精品免费 | 欧美大片天天免费看视频 | 一级特黄性色生活片一区二区 | 精品国产一区二区三区2021 | 欧美成人亚洲欧美成人 | 日韩欧美国产一区二区三区 | 久久久久久久久久鸭 | 中文福利视频 | 久久久亚洲 | 奇米影视在线 | 狠狠色狠狠色综合婷婷tag | 夜夜操天天操 |