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

     2023-02-23     210

关键词:

【中文标题】元类冲突、多重继承、实例为父【英文标题】:Metaclass conflict, multiple inheritance, and instance as parent 【发布时间】:2011-11-20 22:49:41 【问题描述】:

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

    class A(Foo) — 工作,不出所料 class B(Foo()) — 提供的作品 Foo 有一个合适的 __new__ 方法(我提供了) class C(Foo(), Foo) — 在与 B 相同的条件下工作 class D(Foo, Foo()) — 给出著名的元类错误:

    回溯(最近一次通话最后一次): 文件“test.py”,第 59 行,在 D类(Foo,Foo()): TypeError:元类冲突:派生类的元类必须是(非严格) 其所有基础的元类的子类

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

@Paul MRO 是“方法解析顺序”,即在查找方法/属性时检查类及其父类的顺序。我的直觉是,由于第一个父级中的方法“覆盖”了第二个父级中的方法,Python 将处理第二个,然后处理第一个。

unittest 模拟和多重继承:TypeError:元类冲突

】unittest模拟和多重继承:TypeError:元类冲突【英文标题】:unittestmockandmultipleinheritance:TypeError:metaclassconflict【发布时间】:2018-06-0609:32:57【问题描述】:我有一个包,它的依赖项不是pip可安装的。为了能够构建文档,我正在尝... 查看详情

Peewee Model 和 QtCore QObject 的多重继承导致元类冲突

】PeeweeModel和QtCoreQObject的多重继承导致元类冲突【英文标题】:MultipleInheritancewithPeeweeModelandQtCoreQObjectcausingmetaclassconflict【发布时间】:2019-02-0519:58:35【问题描述】:首先我是python新手,这是我的第一篇文章,如果我在这里做错... 查看详情

将元类与多重继承结合使用的 TypeErrors

】将元类与多重继承结合使用的TypeErrors【英文标题】:TypeErrorsusingmetaclassesinconjunctionwithmultipleinheritance【发布时间】:2011-01-1307:42:18【问题描述】:我有两个关于元类和多重继承的问题。第一个是:为什么我会得到类Derived的TypeE... 查看详情

来自元类工厂的多重继承

】来自元类工厂的多重继承【英文标题】:Multiinheritancefrommetaclassesfactories【发布时间】:2012-02-1506:06:54【问题描述】:我希望SuperClass12继承自SuperClass1和SuperClass2:defgetClass1():classMyMetaClass1(type):def__new__(cls,name,bases,dct):printdct.get("A... 查看详情

三重继承导致元类冲突......有时

】三重继承导致元类冲突......有时【英文标题】:Tripleinheritancecausesmetaclassconflict...Sometimes【发布时间】:2011-09-2707:06:24【问题描述】:看起来我偶然发现了一个元类地狱,即使我不想与它有任何关系。我正在使用PySide在Qt4中编... 查看详情

三重继承导致元类冲突......有时

】三重继承导致元类冲突......有时【英文标题】:Tripleinheritancecausesmetaclassconflict...Sometimes【发布时间】:2011-09-2707:06:24【问题描述】:看起来我偶然发现了一个元类地狱,即使我不想与它有任何关系。我正在使用PySide在Qt4中编... 查看详情

元类与 Django 中的 modelformset_factory 冲突

】元类与Django中的modelformset_factory冲突【英文标题】:metaclassconflictwithmodelformset_factoryinDjango【发布时间】:2011-12-1814:15:06【问题描述】:我正在使用Django模型继承来创建两个模型-WorkAttachmentPicture和WorkAttachmentAudioclassWorkAttachment(mo... 查看详情

Sphinx 1.8 Typeerror 元类冲突,Python 2.7

】Sphinx1.8Typeerror元类冲突,Python2.7【英文标题】:Sphinx1.8TyperrorMetaclassconflict,Python2.7【发布时间】:2019-05-1723:19:48【问题描述】:我正在为我的项目在python2.7中生成sphinx1.8文档。我有一个继承三个类的类:classMeta(type(QtGui.QWidget),t... 查看详情

使用 ABC、PolymorphicModel、django-models 会产生元类冲突

】使用ABC、PolymorphicModel、django-models会产生元类冲突【英文标题】:UsingABC,PolymorphicModel,django-modelsgivesmetaclassconflict【发布时间】:2018-04-2909:52:51【问题描述】:到目前为止,关于SO的所有其他答案都以完全相同的方式回答:构建... 查看详情

Django:从带有元的抽象类的多重继承

...问题描述】:我有一个模型继承自2个抽象模型,它们的元类中有属性。如何让它从两个父类继承元数据?好像只继承了先写的类的元数据。【问题讨论】:【参考方案1】:在Django中使用Python的多重继承的一般规则适用。这意味... 查看详情

元类中 __new__ 的行为(也在继承的上下文中)

】元类中__new__的行为(也在继承的上下文中)【英文标题】:Behaviorof__new__inametaclass(alsoincontextofinheritance)【发布时间】:2021-07-1007:45:36【问题描述】:好的,显然元类中的__new__在元类的实例(即类对象)被实例化时运行,因此... 查看详情

什么可以从元类实例化

】什么可以从元类实例化【英文标题】:WhatCanbeinstantiationfromaMetaclass【发布时间】:2017-03-3121:18:10【问题描述】:从元类中实例化一个类可以做什么?据我了解,通常__init__、__del__、__call__等方法来自默认元类type。这是正确的吗... 查看详情

是否可以使用 Python 元类进行反向继承?

】是否可以使用Python元类进行反向继承?【英文标题】:IsitpossibletoinverseinheritanceusingaPythonmetaclass?【发布时间】:2016-11-1904:46:10【问题描述】:出于好奇,我很感兴趣是否可以编写一个元类,使父类的方法优先于子类的方法。我... 查看详情

为啥具有对象基础的元类会引发元类冲突?

】为啥具有对象基础的元类会引发元类冲突?【英文标题】:Whydoesmetaclasswithobjectbaseraisemetaclassconflict?为什么具有对象基础的元类会引发元类冲突?【发布时间】:2018-03-1216:19:18【问题描述】:为什么在下面的代码中带有对象基... 查看详情

javascript实现多重继承

1.定义一个空的父类构造函数,然后通过prototype的方式为该父类定义属性和方法2.定义一个空的子类的构造函数,然后将子类的原型绑定在父类的实例上,再将子类原型的父类也绑定在父类的实例上。通过prototype的方式为子类设... 查看详情

从 pytorch 数据集返回索引:更改 __getitem__ 的函数导致元类冲突

】从pytorch数据集返回索引:更改__getitem__的函数导致元类冲突【英文标题】:ReturningindicesfrompytorchDataset:Functiontoalter__getitem__resultsinmetaclassconflict【发布时间】:2021-07-2014:43:14【问题描述】:我有多个类(用于不同的数据集)继承... 查看详情

TypeError:元类冲突:派生类的元类

】TypeError:元类冲突:派生类的元类【英文标题】:TypeError:metaclassconflict:themetaclassofaderivedclass【发布时间】:2021-06-1819:17:30【问题描述】:fromrest_frameworkimportserializersfromrest_framework.serializersimportModelSerializerfrom.modelsimportP 查看详情

Python 元类冲突

】Python元类冲突【英文标题】:PythonMetaclassconflict【发布时间】:2022-01-1215:09:34【问题描述】:我想要一个使用我的selectpath函数的按钮,但我不知道如何让它在类中工作。非常感谢任何帮助!当我执行它时,我总是得到这个错误... 查看详情