天天看點

python的元類

本文示例代碼在python3.7下

  

輸出

a是A類的執行個體,類A(是一個class)是type的執行個體(注意:類A是type的執行個體,是object的子類,所有新式類的根類都是object)

name:這将是需要建立的類的名稱。對于我們的情況,它将是字元串'A'。

bases:該類基類的元組。

attrs:它是一個字典,包含為該類定義的所有屬性

是以動态建立上述A類可以寫作:

(1).繼承自元類type

(2).在元類中覆寫了__new__

(3).解釋器将使用三個參數調用我們的元類,是以元類的__new__将接收四個參數。是以我們要注意__new__元類需要四個參數

(4).在__new__中我們使用超類中的__new__,如果TestMetaClass不是從type繼承,實際的類建立将發生在type的__new__中

(5).任何類的__new__收到的第一個參數是類本身(上文代碼中的cls)

如果我們編寫元類,必須從type繼承,必須覆寫__new__,并且調用超類的__new__來建立類

<class '__main__.B'>

<class '__main__.TestMetaClass'>

b是類B的一個執行個體,類B是TestMetaClass的執行個體

方法為:

type(some_object)

type(cls類名, bases(繼承的元組), attrs(屬性字典))

注意:

上文代碼中,您或許可能認為直接使用__new__就可以實作,因為__new__就是負責執行個體的建立.但類B中first,second等屬性是靜态屬性,隸屬于類,而不是執行個體,是以此處使用了元類.元類是負責類的建立.

我們使用__new__來寫一個限制執行個體屬性的(不是很恰當)