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
时,它还不存在