gpt4 book ai didi

python - 元类冲突、多重继承、实例为父类

转载 作者:太空狗 更新时间:2023-10-30 02:49:35 25 4
gpt4 key购买 nike

我一直在研究 Python 的黑暗艺术,有些东西我想帮助理解。给定一个类 Foo,这里是我尝试从它继承的一些方法:

  1. class A(Foo) — 有效,不足为奇
  2. class B(Foo()) — 如果 Foo 有一个合适的 __new__ 方法(我提供)
  3. class C(Foo(), Foo) — 在与 B
  4. 相同的条件下工作
  5. class D(Foo, Foo()) — 给出了著名的元类错误:

    Traceback (most recent call last):
       File "test.py", line 59, in
            class D(Foo, Foo()):
    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

究竟是什么导致了这种冲突?当我从 (Foo(), Foo) 继承时(实例第一,类第二)它工作,但是当我继承自 (Foo, Foo()) (类第一,例如第二个),它没有。

最佳答案

当您“继承自一个实例”时,您真正在做的是一种使用元类的奇怪方式。通常,类对象是 type 的实例。对于上面的 B 类,它继承自 Foo 的一个实例。如果您定义一个以 Foo 作为其元类的类,然后从该类继承,就会发生这种情况。

所以我对这里发生的事情的猜测是 Python 正在以相反的 MRO 顺序处理基类。

C 类之所以有效,是因为要处理的第一个父类是 Foo,其类是 type。这意味着 D 的元类必须是 type 或其某个子类。然后处理Foo(),它的类是Foo,它是type的子类,所以一切都很好。

D 类失败,因为要处理的第一个父类是 Foo(),它设置了 D 具有元类 Foo(或子类)的约束。然后 Foo 出现了,它的 type不是 Foo 的子类。

这是一个完整的猜测,但您可以尝试查看有关元类的 Python 文档是否要求当您从具有不同元类的两个类乘法继承时,其中涉及的元类具有子类型关系,您将它们按特定顺序放置.

关于python - 元类冲突、多重继承、实例为父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7483328/

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