什麼是元類
在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 示例執行結果 呼叫自定義模組...