题
下面是一个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)
然后它工作。请注意,即使cls
在super
使用我们还是要提供cls
作为参数为好,因为这里super
返回一个不受约束的方法(见的此处更多)。
作为替代使用超级人们可以使用:
return type.__new__(cls, name, bases, attrs)
重要的是,我们给cls
(我们的元类对象Z
)的类方法__new__
。在较短的形式type(name, bases, attrs)
填补type
本身的cls
说法,这当然是错误的。此错误类似于调用与错误self
参数的一个实例方法。
我更喜欢使用super
,因为这是更好的风格。
不隶属于 StackOverflow