多继承元类冲突

问题描述 投票:6回答:2

我需要一个类的双重继承。我尝试了几种语法,但我不理解元类的概念。

from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser

class FinalClass(ConfigParser, QStandardItem):
    def __init__(self, param):
        ConfigParser.__init__(self)
        QStandardItem.__init__(self)
python-3.x pyqt multiple-inheritance
2个回答
14
投票

您的案例中的问题是您尝试继承的类具有不同的元类:

>>> 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对象存储为实例变量,并在需要时使用它。


-2
投票

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等元类,你也需要打扰他们。

© www.soinside.com 2019 - 2024. All rights reserved.