问题是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
,因为这是更好的样式。