[心得]python元類解密

tangchen2016發表於2016-10-28
在大多數程式語言中,類就是一組用來描述如何生成一個物件的程式碼段。
類同樣也是一種物件。是的,沒錯,就是物件。只要你使用關鍵字classPython直譯器在執行的時候就會建立一個物件。
這個物件(類)自身擁有建立物件(類例項)的能力,而這就是為什麼它是一個類的原因。它的本質仍然是一個物件。

type有一種完全不同的能力,它也能動態的建立類。type可以接受一個類的描述作為引數,然後返回一個類。

type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))

Foo = type('Foo', (), {'bar':True})
繼承
FooChild = type('FooChild', (Foo,),{})
定義函式:
def echo_bar(self):
…       print self.bar
…
>>> FooChild = type('FooChild', (Foo,), {'echo_bar': echo_bar})

元類就是用來建立類的“東西”。type就是Python在背後用來建立所有類的元類。

可以在寫一個類的時候為其新增__metaclass__屬性。
元類的主要目的就是為了當建立類時能夠自動地改變類。元類的主要用途是建立API。
就元類本身而言,它們其實是很簡單的:
1)   攔截類的建立
2)   修改類
3)   返回修改之後的類

還可以通過其他兩種技術來修改類:
1Monkey patching
Monkey patch就是在執行時對已有的程式碼進行修改,達到hot patch的目的。
2)  class decorators
decorator 其實就是一個至少具有一個引數的函式 —— 程式設計師要負責確保 decorator 的返回內容仍然是一個有意義的函式或方法,並且實現了原函式為使連線有用而做的事情。

相關文章