標籤:感想 語言 基於 執行 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 對象屬性的訪問