这是一个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
>>>
Run Code Online (Sandbox Code Playgroud)
在我定义类XI之后,期望为它调用Z._new__,并打印两行,这是没有发生的(因为继承了元类?)
nik*_*kow 13
问题是cls
在调用时不传递参数(它是元类对象)type
,因此Y
创建和返回的类对象没有对元类的任何引用Z
.
如果更换的最后一行__new__
用
return super(Z, cls).__new__(cls, name, bases, attrs)
Run Code Online (Sandbox Code Playgroud)
然后它工作.请注意,即使cls
是用在super
我们还是要提供cls
作为参数为好,因为super
这里返回未绑定的方法(参见这里更多).
作为使用超级用户的替代方案,可以使用:
return type.__new__(cls, name, bases, attrs)
Run Code Online (Sandbox Code Playgroud)
重要的是我们将cls
(我们的元类对象Z
)赋予classmethod __new__
.较短的形式type(name, bases, attrs)
填补type
了cls
论证,这当然是错误的.此错误类似于使用错误的self
参数调用实例方法.
我更喜欢使用super
,因为这是更好的风格.