【问题标题】:meta class doesn't get inherited元类不会被继承
【发布时间】:2021-03-22 04:08:23
【问题描述】:

在以下代码中:

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 都被打印出来,但我看到元类只应用于A。我该如何解决这个问题?我的目标是预处理A 的所有孩子的字段,我想省略在每个孩子中输入metaclass=Meta

【问题讨论】:

    标签: python python-3.x metaclass


    【解决方案1】:

    由于您返回type(name, bases, attrs),您将获得type 类型的对象,而不是Meta。您可以通过打印A.__class__ 进行检查。相反,您应该返回:

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

    【讨论】:

    • AivanF.:另外,虽然你没有错,但基类的声明可以缩短为简单的class A(metaclass=Meta):
    【解决方案2】:

    您的元类实际上不是Meta。如果你执行type(a),你会得到<class 'type'>,因为你覆盖Meta.__new__ 以返回一个普通的type,而不是Meta 实例。

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

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

    然后你会看到 AB 都打印出来,如你所愿。

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 2018-01-27
      • 2020-03-19
      • 2016-05-29
      • 2016-09-21
      • 2021-05-01
      • 2012-06-03
      • 2017-02-26
      相关资源
      最近更新 更多