Pau*_*nta 4 python inheritance metaclass
我一直在搞乱Python的黑暗艺术,我想帮助理解.给定一个类Foo,这是我试图从中继承的一些方法:
class A(Foo) - 工作,毫不含糊class B(Foo())- 提供的作品Foo有适当的__new__方法(我提供)class C(Foo(), Foo) - 工作,在相同的条件下 Bclass D(Foo, Foo()) - 给出了着名的元类错误:
回溯(最近调用最后一次):
文件"test.py",第59行,在
D类中(Foo,Foo()):
TypeError:元类冲突:派生类的元类必须是(非严格)子类所有基地的元类
究竟是什么导致了这场冲突?当我从(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文档是否需要从两个具有不同元类的类中继承,其中涉及的元类具有子类型关系,您将它们按特定顺序放置.