簡體   English   中英

未在子類中調用元類

[英]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)

然后它工作。 請注意,即使clssuper使用,我們仍然必須提供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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM