Python 使用哪个元类创建具有多个基的类?
假设我们有:Python 使用哪个元类创建具有多个基的类?,python,python-3.x,Python,Python 3.x,假设我们有: class CustomType(type): pass class A(metaclass=CustomType): pass class B(): pass class C(B,A): pass 如果我们尝试这样做: In [122]: C.__mro__ 我们将获得下一个输出: Out[122]: (__main__.C, __main__.B, __main__.A, object) 以及下一个输入: In [123]: type(C) 返回以下内容: Out
class CustomType(type): pass
class A(metaclass=CustomType): pass
class B(): pass
class C(B,A): pass
如果我们尝试这样做:
In [122]: C.__mro__
我们将获得下一个输出:
Out[122]: (__main__.C, __main__.B, __main__.A, object)
以及下一个输入:
In [123]: type(C)
返回以下内容:
Out[123]: __main__.CustomType
您能帮助我理解Python是如何决定使用CustomType
而不是内置的type
元类作为工厂来创建D
,即使在C.\uu mro.中的\uuu main\uuuuuu>类型的\uuu main\uuuuuuuuu.a前面加上类型为“CustomType”的时也是如此吗
类定义的适当元类确定为
如下:
- 如果没有给出基和显式元类,则使用type()李>
- 如果给定了显式元类,但它不是()类型的实例,
然后直接将其用作元类李>
- 如果类型()的实例是
给定为显式元类,或定义了基,则
使用派生元类。
最派生的元类是从显式指定的元类(如果有)和所有指定基类的元类(即类型(cls))中选择的最派生的元类是所有这些候选元类的子类型。如果所有候选元类都不符合该标准,则类定义将失败,并出现TypeError
候选元类是CustomType
(作为A
的元类)和type
(作为B
的元类)CustomType
是两个候选项的子类型
C
的MRO是不相关的,因为当您仍然试图确定要使用哪个元类来创建C
时,它还不存在