下面是一个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
>>> 

在我定义类X I期望Z._new__被调用它,并且打印两个线路,这是不会发生,(如<强>元类被继承?)

有帮助吗?

解决方案

在的问题是,cls参数(其是元类对象)不传递当调用type上,因此所创建的类对象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__。在较短的形式type(name, bases, attrs)填补type本身的cls说法,这当然是错误的。此错误类似于调用与错误self参数的一个实例方法。

我更喜欢使用super,因为这是更好的风格。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top