gpt4 book ai didi

Python元类混淆

转载 作者:行者123 更新时间:2023-11-28 21:56:19 26 4
gpt4 key购买 nike

在多重继承的情况下,我对元类有点困惑。

考虑以下代码:

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. 关于元类冲突的类型错误,这是预期的,没有问题。

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

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. “MetaClass2继承”

    “元类1”

  3. “MetaClass2继承”

    “元类1”

C类的MRO是:

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

为什么 C 类接收 MetaClass2 而不是 MetaClass1 作为其元类?

最佳答案

当决定一个没有明确指定的类的元类时,如 C 的情况,Python 会检查正在创建的类的所有父类(super class)(直接和间接)的元类,并选择一个元类,它是正在创建的类的父类(super class)的所有元类的子类型。如果没有这样的元类,它会引发一个 TypeError

在您的示例中,MetaClass2 是一个元类,它继承自 C 的父类(super class)的所有元类。

这包含在 section 3.3.3.1 中语言引用。

关于Python元类混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21659360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com