在嘗試理解元類建立類例項的順序時,我感到困惑.根據該圖(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開始,可...