Python元类混淆

2024-04-25 15:01:44 发布

您现在位置:Python中文网/ 问答频道 /正文

对于多重继承的元类,我有点困惑。你知道吗

考虑以下代码:

class MetaClass1(type):
    def __init__(cls, name, bases, dict_):
        print "MetaClass1"

class MetaClass2(type):
    def __init__(cls, name, bases, dict_):
        print "MetaClass2"

class A(object):
    __metaclass__ = MetaClass1


class B(object):
    __metaclass__ = MetaClass2

class C(A, B):
    pass

其输出如下:

  1. “元类1”

  2. “元类2”

  3. 关于元类冲突的TypeError,这是预期的,没有问题。

接下来我将稍微更改代码并执行以下操作:

class MetaClass1(type):
    def __init__(cls, name, bases, dict_):
        print "MetaClass1"

class MetaClass2(MetaClass1):
    def __init__(cls, name, bases, dict_):
        print "MetaClass2 inherits"
        super(MetaClass2, cls).__init__(name, bases, dict_)

class A(object):
    __metaclass__ = MetaClass1


class B(object):
    __metaclass__ = MetaClass2

class C(A, B):
    pass

这次的输出是:

  1. “元类1”

  2. “元类2继承”

    “元类1”

  3. “元类2继承”

    “元类1”

C类MRO为:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]

为什么类C接收元类2作为它的元类而不是元类1?你知道吗


Tags: 代码nameobjectinitmaindeftypedict
1条回答
网友
1楼 · 发布于 2024-04-25 15:01:44

当决定一个没有显式指定元类的类的元类时,比如在C的情况下,Python检查被创建的类的所有超类(直接和间接)的元类,并选择一个元类,它是被创建的类的超类的所有元类的子类型。如果没有这样的元类,它将引发TypeError。你知道吗

在您的示例中,MetaClass2是从C的超类的所有元类继承的元类。你知道吗

语言参考的section 3.3.3.1中介绍了这一点。你知道吗

相关问题 更多 >