多重继承元类冲突
Multiple inheritance metaclass conflict
我需要 class 的双重继承。
我尝试了几种语法,但我不明白 metaclass.
的概念
from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser
class FinalClass(ConfigParser, QStandardItem):
def __init__(self, param):
ConfigParser.__init__(self)
QStandardItem.__init__(self)
您的问题是您尝试继承的 classes 具有不同的元classes:
>>> type(QStandardItem)
<class 'sip.wrappertype'>
>>> type(ConfigParser)
<class 'abc.ABCMeta'>
因此 python 无法决定哪个应该是新创建的 class 的元 class。在这种情况下,它必须是 class 继承自 sip.wrappertype
(或 PyQt5.QtCore.pyqtWrapperType
对于旧的 PyQt5 版本)和 ABCMeta
.
因此,metaclass 冲突可以通过显式引入这样的 class 作为 metaclass 来解决,如下所示:
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 对象存储为实例变量并在需要时使用它会更好。
您可以使 base class
的 metaclass
扩展自 Qt
元类系统
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_()
我需要 class 的双重继承。 我尝试了几种语法,但我不明白 metaclass.
的概念from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser
class FinalClass(ConfigParser, QStandardItem):
def __init__(self, param):
ConfigParser.__init__(self)
QStandardItem.__init__(self)
您的问题是您尝试继承的 classes 具有不同的元classes:
>>> type(QStandardItem)
<class 'sip.wrappertype'>
>>> type(ConfigParser)
<class 'abc.ABCMeta'>
因此 python 无法决定哪个应该是新创建的 class 的元 class。在这种情况下,它必须是 class 继承自 sip.wrappertype
(或 PyQt5.QtCore.pyqtWrapperType
对于旧的 PyQt5 版本)和 ABCMeta
.
因此,metaclass 冲突可以通过显式引入这样的 class 作为 metaclass 来解决,如下所示:
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 对象存储为实例变量并在需要时使用它会更好。
您可以使 base class
的 metaclass
扩展自 Qt
元类系统
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_()