【问题标题】:Python OOPs with PyQt使用 PyQt 的 Python OOP
【发布时间】:2021-04-10 09:04:24
【问题描述】:

我正在创建一个多级继承。我怀疑为什么我在构造函数 (__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

我需要纠正什么?

【问题讨论】:

标签: python python-3.x oop


【解决方案1】:

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

(<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)

所以,我在启动 test_with_qt 之前只在文件底部添加了 app 声明,无论如何,您都需要在程序中添加它:

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

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

super().__init__()

【讨论】:

  • 正如你所建议的无参数超级,工作方式相同。谢谢你的建议。同样没有 app=QApplication([]) 我没有收到您提到的错误。但是在保留 app=QApplication([]) 之后,我可以从所有构造函数中获取所有打印结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2015-04-20
  • 2019-01-03
  • 2014-11-26
  • 2020-09-21
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多