[英]Metaclass not being called in subclasses
這是一個python會話。
>>> class Z(type):
def __new__(cls, name, bases, attrs):
print cls
print name
return type(name, bases, attrs)
...
>>> class Y(object):
__metaclass__ = Z
...
<class '__main__.Z'>
Y
>>> class X(Y):
... pass
...
>>> class W(Y):
... __metaclass__ = Z
...
<class '__main__.Z'>
W
>>>
在我定義類XI之后,期望為它調用Z._new__,並打印兩行,這是沒有發生的(因為元類是繼承的嗎?)
問題是當你調用type
時沒有傳遞cls
參數(它是元類對象),因此創建和返回的類對象Y
沒有對元類Z
任何引用。
如果你用__new__
替換最后一行
return super(Z, cls).__new__(cls, name, bases, attrs)
然后它工作。 請注意,即使cls
在super
使用,我們仍然必須提供cls
作為參數,因為super
在這里返回一個未綁定的方法(有關更多信息,請參閱此處 )。
作為使用超級用戶的替代方案,可以使用:
return type.__new__(cls, name, bases, attrs)
重要的是我們將cls
(我們的元類對象Z
) __new__
classmethod __new__
。 較短的表單type(name, bases, attrs)
為cls
參數填充type
本身,這當然是錯誤的。 此錯誤類似於使用錯誤的self
參數調用實例方法。
我更喜歡使用super
,因為這是更好的風格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.