python - 使用 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。
我需要纠正什么?
解决方案
这是我在运行您的代码时得到的完整输出(请注意,将来您应该尝试在问题中包含完整输出):
(<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__()
推荐阅读
- r - 为什么 R / RStudio 会产生不一致的正则表达式错误?
- javascript - AJAX 请求不刷新由 multi.js 库修改
- flutter - 如何在一个类中为多个类使用getter而不实例化
- azure - 将新卷附加到持久卷声明 (Kubernetes)
- xml - 如何使位图中的图像适合 Xamarin 中的屏幕大小
- mysql - “AWS RDS 数据库错误:ER_NO_SUCH_TABLE:表不存在”-但相同的架构在本地 mysql/Nodejs 上运行良好
- javascript - 如何使用通过参数传递的函数来格式化给定的必填字段的复杂对象?
- javascript - React、Express、socket.io 没有实时更新,控制台没有错误
- sql - 我可以使用 sql 查询来获取 PostgreSQL 数据库中所有主键和外键的列表吗
- javascript - 为什么OR(||)语句在while循环中不起作用,javascript