我在Youtube教程中找到了这个简单的程序,它使用了QtSide模块和python。基本上它的作用是将QLineEdit
连接到QTextBrowser
。如下所示,整个程序由单个类处理。我有super()函数的基本思想,它用于多继承。所以在这里,我不明白super(Form, self).__init__(parent)
语句的作用。我在评论产生以下错误消息的语句后尝试运行相同的程序。
错误:
Traceback (most recent call last):
File "/home/dazz/Projects/PycharmProjects/FirstTutorial/a2_gui.py", line 35, in <module>
form = Form()
File "/home/dazz/Projects/PycharmProjects/FirstTutorial/a2_gui.py", line 17, in __init__
self.setLayout(layout)
RuntimeError: '__init__' method of object's base class (Form) not called.
程序代码:
import sys
from PySide.QtCore import *
from PySide.QtGui import *
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.browser = QTextBrowser()
self.lineEdit = QLineEdit()
layout = QVBoxLayout()
layout.addWidget(self.browser)
layout.addWidget(self.lineEdit)
self.setLayout(layout)
self.lineEdit.returnPressed.connect(self.update_ui)
self.setWindowTitle('Calculate')
def update_ui(self):
try:
text = self.lineEdit.text()
self.browser.append('%s = %s' % (text, eval(text)))
self.lineEdit.selectAll()
except:
self.browser.append('%s is invalid!' % text)
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
在这里,super()
有什么用?
我发现了question可能与此有关。但我不清楚。
答案 0 :(得分:3)
super()
用于继承,多个或其他方式来调用可能已在当前类中重写的方法。
此处super()
用于调用为__init__
定义的原始QDialog
方法或其父类。不调用原文可能会产生后果,因为原始方法确实有效,您不想在自己的__init__
方法中进行复制。
super()
使多重继承变得更容易,更灵活,但多重继承不是 。
答案 1 :(得分:2)
基本上,正如您已经了解的那样,super()用于继承。正如Martjin所提到的那样,后果&#39;当你评论时,你的案例中出现的是需要初始化,这已经在`QDialog&#39;类。
因此,在这个子类中需要做的就是调用父进程。
此处super
和init
上的stackoverflow中已有一篇很好的文章。