13.16.5 元類和__metaclass__
1. 元類(metaclasses)是什麼
元類讓你來定義某些類是如何被建立的,從根本上說,賦予你如何建立類的控制權。
從根本上說,你可以把元類想成是乙個類中類,或是乙個類,它的例項是其他的類。當你建立乙個新類時,你就是在使用預設的元類,它是乙個型別物件(對傳統的類來說,它們的元類是types.classtype)。當某個類呼叫type()函式時,你就會看到它到底是誰的例項。
>>> class d(object):
... pass
...
>>> class e:
... pass
...
>>> type(e) is types.classtype
true
>>> type(d) is type
true
>>>
2. 什麼時候使用元類
元類一般用於建立類。在執行類定義時,直譯器必須要知道這個類的正確的元類。直譯器會先尋找類屬性__metaclass__,如果此屬性存在,就將這個屬性賦值給此類作為它的元類。如果此屬性沒有定義,它會向上查詢父類中的__metaclass__。所有新風格的類如果沒有任何父類,會從物件或型別中繼承(type(object)當然是型別)。
如果還沒有發現__metaclass__屬性,直譯器會檢查名字為__metaclass__的全域性變數;如果它存在,就使用它作為元類。否則,這個類就是乙個傳統類,並用types.classtype作為此類的元類。如果你定義了乙個傳統類,並且設定它的__metaclass__=type,其實你是在將它公升級為乙個新風格的類!
3. 誰在用元類
你通過定義乙個元類來「迫使」程式設計師按照某種方式實現目標類,這將既可以簡化他們的工作,也可以使所編寫的程式更符合特定標準。
第13章 物件導向程式設計 13
13.13.3 迭代器 randseq和anyiter 1.randseq from random import choice class randseq object def init self,seq self.data seq def iter self return self def nex...
第13章 物件導向程式設計 3
13.4 類屬性 屬性就是屬於另乙個物件的資料或者函式元素,可以通過我們熟悉的句點屬性標識來訪問。13.4.1 類的資料屬性 資料屬性僅僅是所定義的類的變數。靜態變數,或者是靜態資料表示這些資料是與它們所屬的類物件繫結的,不依賴於任何類例項。靜態成員通常僅用來跟蹤與類相關的值。大多數情況下,你會考慮...
第13章 物件導向程式設計 11
13.12 類 例項和其他物件的內建函式 13.12.1 issubclass issubclass 布林函式判斷乙個類是否另乙個類的子類或子孫類。class sortedkeydict dict def keys self return sorted super sortedkeydict,sel...