首页 > 解决方案 > 使用 PyQt 的 Python OOP

问题描述

我正在创建一个多级继承。我怀疑为什么我在构造函数(__init__)中的基类方法没有被调用,只是super正在执行。

这是我的例子。

from PyQt5.QtWidgets import QMainWindow

class PSheet(object):

    def __init__(self):

        print('PSheet - Start')
        super(PSheet, self).__init__()
        print('PSheet - End')

        self.some_method()

    def some_method(self):

        print('PSheet - In Some Method')

class config(object):

    def __init__(self):
        print('config - Start')
        super(config, self).__init__()
        print('config - End')

class BaseClassWithQt(QMainWindow, config):

    def __init__(self):
        print('BaseClassWithQt - Start')
        super(BaseClassWithQt, self).__init__()
        print('BaseClassWithQt - End')

class DerivedClassWithQt(BaseClassWithQt, PSheet):

    def __init__(self):
        print('DerivedClassWithQt - Start')
        super(DerivedClassWithQt, self).__init__()
        print('DerivedClassWithQt - End')


print(DerivedClassWithQt.__mro__)
test_with_qt = DerivedClassWithQt()

输出

(<class '__main__.DerivedClassWithQt'>, <class '__main__.BaseClassWithQt'>, <class '__main__.config'>, <class '__main__.PSheet'>, <class 'object'>)
DerivedClassWithQt - Start
BaseClassWithQt - Start

我很困惑我在做什么错,因为我没有得到所有构造函数中可用的所有打印。

为了澄清起见,我也为这两种情况打印了mro

我需要纠正什么?

标签: pythonpython-3.xoop

解决方案


这是我在运行您的代码时得到的完整输出(请注意,将来您应该尝试在问题中包含完整输出):

(<class '__main__.DerivedClassWithQt'>, <class '__main__.BaseClassWithQt'>, <class 'PyQt5.QtWidgets.QMainWindow'>, <class 'PyQt5.QtWidgets.QWidget'>, <class 'PyQt5.QtCore.QObject'>, <class 'sip.wrapper'>, <class 'PyQt5.QtGui.QPaintDevice'>, <class 'sip.simplewrapper'>, <class '__main__.config'>, <class '__main__.PSheet'>, <class 'object'>)
DerivedClassWithQt - Start
BaseClassWithQt - Start
QWidget: Must construct a QApplication before a QWidget
Aborted (core dumped)

因此,我app在 开始之前仅在文件底部添加了声明,test_with_qt无论如何您都需要在程序中添加该声明:

app = QApplication([])

# print(DerivedClassWithQt.__mro__)
test_with_qt = DerivedClassWithQt()

然后,这给了我以下输出(没有 mro):

DerivedClassWithQt - Start
BaseClassWithQt - Start
config - Start
PSheet - Start
PSheet - End
PSheet - In Some Method
config - End
BaseClassWithQt - End
DerivedClassWithQt - End

作为旁注,您可以通过使用 parameter-less 来节省一些写作super,因为它等同于您所写的内容。例如对于BaseWithQt类和所有其他类,您只需要:

super().__init__()

推荐阅读