python 對象屬性的訪問

來源:互聯網
上載者:User

標籤:感想   語言   基於   執行   des   attribute   不能   classname   dict   

閱讀了fluent python的metaprogramming這一大章節,下面對閱讀後產生的感想做一下總結。

 

首先是關於對象 屬性 訪問的4個protocol

按照理解可以劃分為

__getattribute__         

__getattr__        __setattr__      __delattr__

這樣劃分是因為  __getattribute__   方法只有在對象有該屬性時,需要get 對象的某個屬性值時,才會執行該方法,可以將這個方法理解為    屬性的唯讀, 我想這也是為什麼它和其他三個方法名字不一樣的原因

__getattr__會在沒有找到該屬性的時候執行,__setattr__用來增加一個屬性,__delattr__用來刪除一個屬性。

 

 

 

然後是property和descriptor

之所以有這些是因為希望     訪問對象屬性時,能夠控制   對象屬性   get,set,del  的過程

 

property就是      python語言內建的     descriptor,     所以它功能不夠定製化,一些類所擁有的優點(例如   類可以繼承, 類可以帶有類屬性)這些property都不支援。

所以在property的基礎上   有了    descriptor

 

 

 

 

最後是metaclass

這是因為某些情境   例如ORM,Django中的validator,這個時候人們希望能夠     控制類的屬性

1. 首先想到的方式是class decorator,     但是這種方式的缺點是   這種方式是基於函數的, 所以不像class一樣能夠繼承

2. 然後人們想到了 metaclass,

   首先明確一點,type      是python語言內建的    metaclass,     在聲明class的時候,背後的機理就是type(classname, bases, attr_dict),   背後就是type這個metaclass產生了  class 

   但是type由於是內建的,很顯然不能定製化,    所以有時候就需要人們自己編寫    metaclass

    自己編寫的 metaclass繼承  type   ,所以繼承了type能夠建立  class的能力(我想這就是繼承的含義:    子類       能夠繼承    父類的能力)

python 對象屬性的訪問

聯繫我們

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