元类冲突,多重继承和实例作为父级

Pau*_*nta 4 python inheritance metaclass

我一直在搞乱Python的黑暗艺术,我想帮助理解.给定一个类Foo,这是我试图从中继承的一些方法:

  1. class A(Foo) - 工作,毫不含糊
  2. class B(Foo())- 提供的作品Foo有适当的__new__方法(我提供)
  3. class C(Foo(), Foo) - 工作,在相同的条件下 B
  4. class D(Foo, Foo()) - 给出了着名的元类错误:

    回溯(最近调用最后一次):
       文件"test.py",第59行,在
            D类中(Foo,Foo()):
    TypeError:元类冲突:派生类的元类必须是(非严格)子类所有基地的元类

究竟是什么导致了这场冲突?当我从(Foo(), Foo)(第一个实例,第二个类)继承时,它可以工作,但是当我继承(Foo, Foo())(第一个类,实例第二个)时,它不会.

Ben*_*Ben 5

当你"从实例中固有"时,你真正在做的是使用元类的一种奇怪方式.通常,类对象是实例type.在上面的B类的情况下,它继承自的实例Foo.如果您使用Foo其元类定义了一个类,然后继承了该类,那么这正是会发生的情况.

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

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

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

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