Python基本語法之元類

2021-09-01 18:33:50 字數 2244 閱讀 3083

什麼是元類

在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())

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為元類的結論。

待更新。

兩種類定義方法

使用傳統的類定義方法和元類定義方法示例如下:

class person:

pass

class x1(person):

age = 21

x2 = type('x2', (person,), )

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', (), )

print (x.__dict__)

示例執行結果如下:

python類基本語法筆記

語言是工具,一段時間不用就會忘掉語法。靜態方法和類方法 什麼時候會用到這樣的方法呢?類方法是針對類存在的,可以用類直接呼叫。主要用到的兩個函式是staticmethod 和classmethod 簡潔的用法是用python的修飾器。需要注意到python的方法是引用型的,這樣的好處是可以直接賦值,或...

Python高階之 元類

幾個魔術方法 new init call new 物件的建立,是乙個靜態方法,第乙個引數是cls 想想也是,不可能是self,物件還沒建立,哪來的self init 物件的初始化,是乙個例項方法,第乙個引數是self call 物件可call,注意不是類,是物件。class bar object d...

Python基本語法之模組

什麼是模組?模組是乙個包含所有你定義的函式和變數的檔案,或者是系統定義的標準檔案,字尾名是.py,可以供我們呼叫。呼叫標準模組 示例 import sys for i in sys.argv print i print n npython path sys.path,n 示例執行結果 呼叫自定義模組...