多继承元类冲突

Mau*_*cio 9 python pyqt multiple-inheritance python-3.x pyqt5

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

from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser

class FinalClass(ConfigParser, QStandardItem):
    def __init__(self, param):
        ConfigParser.__init__(self)
        QStandardItem.__init__(self)
Run Code Online (Sandbox Code Playgroud)

mat*_*ata 18

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

>>> type(QStandardItem)
<class 'sip.wrappertype'> 
>>> type(ConfigParser)
<class 'abc.ABCMeta'>
Run Code Online (Sandbox Code Playgroud)

因此,python无法确定哪个应该是新创建的类的元类.在这种情况下,它必须是一个继承自sip.wrappertype和的类PyQt5.QtCore.pyqtWrapperType.

因此,元类冲突可以通过明确地引入像这样的元类这样的类来解决:

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)
Run Code Online (Sandbox Code Playgroud)

如果您想要更详细的描述,这篇文章是一个好的开始.

但是我并不是真的相信在这种情境中使用多重继承是一个好主意,特别是将多重继承与QObjects一起使用可能会非常棘手.也许最好只将ConfigParser对象存储为实例变量,并在需要时使用它.


Bai*_*ong 7

您可以从元类系统扩展base class您的metaclassQt

import abc

from PySide2 import QtWidgets, QtCore


class MixinMeta(type(QtCore.QObject), abc.ABCMeta):
    pass


class MyMixin(object, metaclass=MixinMeta):
    @abc.abstractmethod
    def howToShow(self):
        pass

    def doShow(self):
        self.howToShow()


class MyWidget(QtWidgets.QWidget, MyMixin):
    def howToShow(self):
        self.show()


app = QtWidgets.QApplication()
widget = MyWidget()
widget.doShow()
app.exec_()
Run Code Online (Sandbox Code Playgroud)