Python元类混淆

2021-11-29 22:23:39 发布

您现在位置: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?你知道吗