没有在子类中调用元类

发布于 2021-01-29 17:32:52

这是一个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__,并打印出两行,这是没有发生的(因为 元类 是继承的?)

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看