我需要一个类的双重继承。我尝试了几种语法,但我不理解元类的概念。
from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser
class FinalClass(ConfigParser, QStandardItem):
def __init__(self, param):
ConfigParser.__init__(self)
QStandardItem.__init__(self)
您的案例中的问题是您尝试继承的类具有不同的元类:
>>> type(QStandardItem)
<class 'sip.wrappertype'>
>>> type(ConfigParser)
<class 'abc.ABCMeta'>
因此,python无法确定哪个应该是新创建的类的元类。在这种情况下,它必须是一个继承自sip.wrappertype
(或旧版PyQt5版本的PyQt5.QtCore.pyqtWrapperType
)和ABCMeta
的类。
因此,元类冲突可以通过明确地引入像这样的元类这样的类来解决:
from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser
class FinalMeta(type(QStandardItem), type(ConfigParser)):
pass
class FinalClass(ConfigParser, QStandardItem, metaclass=FinalMeta):
def __init__(self, param):
ConfigParser.__init__(self)
QStandardItem.__init__(self)
如果你想要更详细的描述,this article是一个好的开始。
但是我并不是真的相信在这种情境中使用多重继承是一个好主意,特别是将多重继承与QObjects一起使用可能会非常棘手。也许最好只将ConfigParser对象存储为实例变量,并在需要时使用它。
Guido van Rossum经常提到“将元素投入工作”这本书作为灵感来源。作为回报,PMtW是由前SOM开发人员编写的,并记录了自从被IBM抛弃以来从未发生过的SOM改进。
Guido van Rossum遵循PMtW模型关于合作方法和MRO,因此Python得到了很好的多重继承,SOM绝对缺失。 SOM更像是C ++,具有显式的父类调用。
然而,他背叛了SOM和PMtW关于元类的核心思想。在SOM和PMtW中,元类是自动派生的,如果类有它们,开发人员就不会感到烦恼。上课并不常见于公开场合:哦,嘿,我用元类管理我的数据,但这是我的私人业务。继续前进,这里没什么重要的。
有时候模式是从某些类中明确地继承知道它背后的元类。有些元类对它们管理的类提出了要求,因此没有必要明确指定元类。无论如何,你需要从指定的类派生出来,并且一旦你这样做,就会获得元类作为奖励。自动派生的元类需要一些方法来解决冲突。并且有方法来实现协议。这些方法不能由元类引入,还有一个层,3级元类,规范的Before / After元类就像这样工作。 3不是限制。 PMtW书中有一个样本类图,在他们真实的SOM库中有4层元类,而且我在那里看到的恕我直言是有道理的。
鉴于SOM正在管理封闭的源代码库,这一点尤为重要。它不是在编辑器中修复的文本脚本。
但是,不是在Python世界中。 Guido van Rossum懒得从原书中实施putting.om.Environment.solveMetaclassConstraints。这就是你面临这个问题的原因。
你需要在Python中烦恼打扰类的元类。如果他们获得等级3,等级4等元类,你也需要打扰他们。