在继承之外的`__init__`里面使用python`super()`的目的是什么?

时间:2015-10-08 07:11:34

标签: python pyside multiple-inheritance super

我在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可能与此有关。但我不清楚。

2 个答案:

答案 0 :(得分:3)

super()用于继承,多个或其他方式来调用可能已在当前类中重写的方法。

此处super()用于调用为__init__定义的原始QDialog方法或其父类。不调用原文可能会产生后果,因为原始方法确实有效,您不想在自己的__init__方法中进行复制。

super()使多重继承变得更容易,更灵活,但多重继承不是

答案 1 :(得分:2)

基本上,正如您已经了解的那样,super()用于继承。正如Martjin所提到的那样,后果&#39;当你评论时,你的案例中出现的是需要初始化,这已经在`QDialog&#39;类。

因此,在这个子类中需要做的就是调用父进程。

此处superinit上的stackoverflow中已有一篇很好的文章。

super and init

相关问题