1. 程式人生 > >python中的元類解讀

python中的元類解讀

在多數的程式語言中,類就是一組用來描述如何生成一個物件的程式碼段,但類也是物件。只要使用關鍵詞class。python直譯器在執行時就會建立一個物件。對於一個物件·:可做的操作:賦值給一個變數,拷貝,增加屬性,作為函式引數進行傳遞等。

類也是物件,可以在執行時動態的建立。對於動態的建立類,可以使用type,它可以接受一個類的描述作為引數,然後返回一個類,另一方面,type還可以建立帶有屬性的類,可以接受一個字典來為類定義屬性,也可以使用type建立帶有方法的類,即為類增加方法時,可以定義一個恰當簽名的函式並將其作為屬性。

在python中,類也是物件,可以動態的建立類,使用關鍵詞class時,python在幕後做的事,就是同通過元類來實現的

元類就是用來建立類的“東西”,建立類就是建立類的例項物件,元類就是用來建立這些類(物件)的,元類就是類的類

MyClass= MetaClass() #使用元類創建出一個物件,這個物件成為“類”
MyObject = Myclass() #使用“類”來創建出例項物件

Myclass = type('MyClass')

函式type實際上是一個元類,是python在背後用來建立所有類的元類。Python中的所有東西都是物件,包括整數、字串、函式以及類,都是從type類中建立而來。因此,元類就是建立類這種物件的東西,type就是python的內建元類。使用者可可以建立自己的元類。

在定義類時可新增__metaclass__屬性

class Foo(object):
    __metaclass__ = something...
    ...省略...

Python中做了如下的操作:

1.Foo中有__metaclass__這個屬性嗎?如果有,python會通過__metaclass__建立一個名字為Foo的類(物件)

2.如果Python沒有找到__metaclaa__,它會繼續在object(父類)中尋找__metaclass__屬性,並嘗試做和前面同樣的操作。

3.如果Python在任何父類中都找不到__metaclass__,它會在模組層次中去尋找__metaclass__.並嘗試做同樣的操作。

4.如果還是找不到__metaclass__,python就會用內建的type來建立這個類物件。

在__metaclass__中放置的程式碼可以是建立一個類的東西,可以用type或者子類化type來建立這個類。

對於元類本身而言,可以總結為三步:1攔截類的建立,2.修改類 ,3.返回修改之後的類。另外元類的掌握不需要特別深刻,使用的機會不多。

本篇總結於傳智播客,若有侵權,請及時告知。