没有在子类中调用元类
这是一个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__,并打印出两行,这是没有发生的(因为 元类 是继承的?)
-
问题是
cls
调用时未传递参数(即元类对象)type
,因此Y
创建并返回的类对象没有对metaclass的任何引用Z
。如果更换的最后一行
__new__
用return super(Z, cls).__new__(cls, name, bases, attrs)
然后就可以了。请注意,即使在
cls
中使用,super
我们也仍然必须提供它cls
作为参数,因为super
这里返回一个未绑定的方法(更多信息请参见此处)。作为使用超级的替代方法,可以使用:
return type.__new__(cls, name, bases, attrs)
重要的是我们将
cls
(我们的元类对象Z
)赋予了classmethod__new__
。较短的形式本身会type(name, bases, attrs)
填充参数,这当然是错误的。此错误类似于使用错误的参数调用实例方法。type``cls``self
我更喜欢使用
super
,因为这是更好的样式。