python3元類 python3元類的呼叫順序

2021-10-19 01:25:52 字數 2169 閱讀 5550

在嘗試理解元類建立類例項的順序時,我感到困惑.根據該圖(source),

我鍵入以下**進行驗證.

class meta(type):

def __call__(self):

print("meta __call__")

super(meta, self).__call__()

def __new__(mcs, name, bases, attrs, **kwargs):

print("meta __new__")

return super().__new__(mcs, name, bases, kwargs)

def __prepare__(msc, name, **kwargs):

print("meta __prepare__")

return {}

class submeta(meta):

def __call__(self):

print("submeta __call__!")

super().__call__()

def __new__(mcs, name, bases, attrs, **kwargs):

print("submeta __new__")

return super().__new__(mcs, name, bases, kwargs)

def __prepare__(msc, name, **kwargs):

print("submeta __prepare__")

return meta.__prepare__(name, kwargs)

class b(metaclass = submeta):

pass

b = b()

但是,結果似乎不是這樣的.

submeta __prepare__

meta __prepare__

submeta __new__

meta __new__

submeta __call__!

meta __call__

任何幫助將不勝感激.

解決方法:

儘管@ torek的長篇答案,以及關於課堂創作的許多其他細節,你在這個問題上匯集的內容大多是正確的.

你的**中唯一錯誤的就是讓你感到困惑的是你呼叫meta的te類本身就是submeta的元類,而不是它的父元素.

只需將submeta宣告更改為:

class submeta(type, metaclass=meta):

(也不需要它繼承「meta」 – 它只能從型別派生.除此之外,我想要定製型別.__ call__,這對於建立類的例項同時是有用的(當呼叫submeta .__ call__時,你的類本身(呼叫meta .__ call__))

這是我剛在終端輸入的另乙個較短的例子.很抱歉命名不一致,並且不太完整 – 但它顯示了要點:

class m(type):

def __call__(mmcls, *args, **kwargs):

print("m's call", args, kwargs)

return super().__call__(*args, **kwargs)

class mm(type, metaclass=m):

def __prepare__(cls, *args, **kw):

print("mm prepare")

return {}

def __new__(mcls, *args, **kw):

print("mm __new__")

return super().__new__(mcls, *args, **kw)

class klass(metaclass=mm):

pass

在處理klass體時,python輸出是:

mm prepare

m's call ('klass', (), ) {}

mm __new__

此外正如您所看到的,使用元元類,可以自定義元類__init__和__new__的呼叫順序和引數,但仍然存在無法從純python**自定義的步驟,並且需要對api的本機呼叫(以及可能的原始物件結構操作) – 即:

>無法控制對__prepare__的呼叫

>無法控制對建立的類的__init_subclass__的呼叫

>可以控制何時呼叫描述符』__set_name__

Python3 元類拓展

自定義元類控制類的建立 class mymeta type def init self,class name,class bases,class dic if not class name.istitle raise typeerror 類名首字母必須大寫 if doc not in class d...

Python3 元類程式設計

在python中一切接物件,類也是乙個物件,所有的類都是有type類建立,我們實際開發中最常用的type方法,是用來獲取某個物件的型別的,例如type 1 int type str str。但是type還有一種用法,就是用來建立類的。1 通過type動態建立無父類 無屬性的類people type ...

python3元組 Python3元組

python的元組與列表相似,不同之處在於元組的元素不能修改 元組使用小括號,列表使用方括號 元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。建立空元組 tup1 tup2 1,元組只包含乙個元素時,需要在元素後面新增逗號,否則括號會被當作運算子使用 元組與字串類似,下標索引從0開始,可...