先以一個大牛的一段關于Python Metapgramming的著名的話來做開頭:
Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why). – Tim Peters
翻譯一下:Metaclasses是99%的用戶都無需費神的黑科技。如果你還在糾結你是不是需要它的話,答案是NO (真正需要的人根本不需要解釋) – Tim Peters
這是什么鬼話?道可道,非常道嗎?
Meta?
好,裝B已畢。這確實是一個冷僻的,不常用的話題。一篇短文肯定講不完。 所以叫做初步了解。
python中的類
首先這里討論的python類,都基于繼承于object的新式類進行討論。
首先在python中,所有東西都是對象。這句話非常重要要理解元類我要重新來理解一下python中的類
class Trick(object): pass
當python在執行帶class語句的時候,會初始化一個類對象放在內存里面。例如這里會初始化一個Trick對象
這個對象(類)自身擁有創建對象(通常我們說的實例,但是在python中還是對象)的能力。
為了方便后續理解,我們可以先嘗試一下在新式類中最古老厲害的關鍵字type。
input:class Trick(object):passprint type('123')print type(123)print type(Trick())output:<type 'str'><type 'int'><class '__main__.Trick'>可以看到能得到我們平時使用的 str, int, 以及我們初始化的一個實例對象Trick()
但是下面的方法你可能沒有見過,type同樣可以用來動態創建一個類
type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))
英文meta這個詞其實是從希臘語里面借來的。wikipedia上的解釋是:
indicate a concept which is an abstraction behind another concept, used to complete or add to the latter
不看還好,其實看了更暈。好在后面的解釋有一句“更高一層的抽象”,可以幫助理解。 其實我們可以這樣理解。meta的意思就是“關于什么的什么”:比如metadata可以理解為“關于數據的數據”,metaprogramming可以理解為“關于編程的編程”。這就和“更高一層的抽象” 比較契合了。同時又隱隱和編程中的另一個永恒主題-recursion聯系在了一起。
另外,meta這個詞天朝這邊翻譯成“元”,海峽對岸翻譯成“后設”。其實我都不大理解從何而來。
元類一般用于創建類。在執行類定義時,解釋器必須要知道這個類的正確的元類。解釋器會先尋找類屬性__metaclass__,如果此屬性存在,就將這個屬性賦值給此類作為它的元類。如果此屬性沒有定義,它會向上查找父類中的__metaclass__.如果還沒有發現__metaclass__屬性,解釋器會檢查名字為__metaclass__的全局變量,如果它存在,就使用它作為元類。否則, 這個類就是一個傳統類,并用 types.ClassType 作為此類的元類。
新聞熱點
疑難解答