meta class 不会被继承

meta class doesn't get inherited

在下面的代码中:

class Meta(type):
    def __new__(cls, name, bases, attrs):
        print(name)
        return type(name, bases, attrs)

class A(object, metaclass=Meta):
    def do_complex_task(self):
        pass

class B(A):
    def do_minor_task(self):
        pass

我希望看到 AB 都打印出来,但我看到元 class 仅应用于 A。我该如何解决这个问题?我的目标是预处理 A 的所有子项的字段,并且我想省略在每个子项中键入 metaclass=Meta

您的元类实际上不是 Meta。如果你这样做 type(a),你会得到 <class 'type'>,因为你将 Meta.__new__ 覆盖为 return 一个普通的 type,而不是 Meta 实例。

一般来说,与普通 类 一样,对于 meta类,您希望覆盖 __init__ 并让 __new__ 执行默认操作。

class Meta(type):
    def __init__(self, name, supers, attrs):
        print(name)

然后您将根据需要看到 AB 被打印出来。

因为你 return type(name, bases, attrs) 你得到一个类型 type 而不是 Meta 的对象。您可以通过打印 A.__class__ 来检查这一点。相反,你应该 return:

return super().__new__(cls, name, bases, attrs)