1. 程式人生 > >Python基本語法之元類

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__)

      示例執行結果如下:

 

 

 

如果你喜歡這篇文章,別忘了點贊和評論!