如何理解 Python 的 Descriptor?

來源:互聯網
上載者:User
有人可以解釋一下python的Descriptor知識嗎?

回複內容:

舊文搬運:

>>> class MyInt(int): ...     def square(self): ...             return self*self ...      >>> n = MyInt(2) >>> n.name = 'two' >>> n.square() 4 >>> n.name 'two' 

簡單來講,描述符就是一個Python對象,但這個對象比較特殊,特殊性在於其屬性的訪問方式不再像普通對象那樣訪問,它通過一種叫描述符協議的方法來訪問。這些方法包括__get__、__set__、__delete__。定義了其中任意一個方法的對象都叫描述符。舉個例子:


普通對象

class Parent(object):    name = 'p'class Person(Parent):    name = "zs"zhangsan = Person()zhangsan.name = "zhangsan"print zhangsan.name#>> zhangsan
以為是Python3.4裡新加的什麼牛逼功能,還和單繼承聯絡起來了。嚇得我趕緊翻了一下文檔。

Descriptor就是一類實現了__get__(), __set__(), __delete__()方法的對象。沒了。就這樣了。沒看懂的話去學習一下duck typing。

用途就很多了。把函數封裝成property,把property封裝成private property等等。圖片python裝飾器文法,foo函數被裝飾後,不再是原函數,
@logger是foo=logger(foo) 的文法糖,
foo是logger(foo)的傳回值inner,inner是一個函數,foo(5)
等於inner(5).inner函數的形式參數是可變長度參數*args,**kwargs,
隨便你傳元組形式或字典形式的資料都可以。

兩篇拙文,入門級水平

簡明Python魔法 -1
簡明Python魔法 -2
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.