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



