Python基本語法之元類
什麼是元類
在Python中,萬物均為物件,如整數、字串、函式以及類都是物件。
元類就是類的類,也就說元類也是一種物件,只不過是一種特殊的物件。
當我們使用關鍵字class時Python在幕後會為我們建立類,而這就是通過元類來實現的,type就是Python在背後用來建立所有類的元類, 也就是說,type是Python的內建元類。
type語法如下:
class type(object) class type(name, bases, dict)
一個引數時type返回物件的類, 三個引數時返回新的類物件。
在一個單數時,引數object為物件。
在三個引數時,name為新的類的名稱,bases為基類的元組,dict字典為類內定義的名稱空間變數。元組就是一個不可變的列表(list)。
如下為type函式示例:
print (type(1)) print (type('shenzhen')) print (type([2])) print (type({0:'zero'})) print (type( 1 ) == int) print (int.__class__) X = type('X', (), {}) print (X) print (X.__class__)
示例執行結果如下:
其中,前四個列印為整型、字串、列表、字典等基本資料型別類名,第五個為邏輯值。
int.__class__為int類的類,即為type,說明int類是由type類創建出來的。
X = type('X', (), {})語句定義了一個新類,類名為X,列印X.__class__,結果仍為type。
從上例,驗證了類的類為type類,該type為元類的結論。
注:如果你對在列印自定義類時疑惑為何會列印‘__main__.類名’,請檢視如下文章連結:
待更新。
兩種類定義方法
使用傳統的類定義方法和元類定義方法示例如下:
class Person:
pass
class X1(Person):
age = 21
X2 = type('X2', (Person,), {'age':21})
print (X1)
print (X2)
print (X1.__dict__)
print (X2.__dict__)
X1類使用傳統的定義方法,X2使用元類定義實現,但X1的定義在執行時,會被Python翻譯成X2的方式執行。
示例執行結果:
自定義元類
自定義元類,需要知道系統的預定義方法__new__。__new__()方法是類的靜態方法,即使沒有被加上靜態方法裝飾器。
__new__ 是在__init__之前被呼叫的特殊方法,是用來建立物件並返回之的方法,我們很少用到__new__,除非希望能夠控制物件的建立,這裡,我們建立的物件是類,我們希望能夠自定義它,所以這裡改寫__new__。
如下為自定義元類的示例:
class UpperAttrMetaclass(type):
def __new__(cls, name, bases, dct):
attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
uppercase_attr = dict((name.upper(), value) for name, value in attrs)
return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr)
X = UpperAttrMetaclass('X2', (), {'age':21})
print (X.__dict__)
示例執行結果如下:
如果你喜歡這篇文章,別忘了點贊和評論!