2015-10-08 1 views
2

Я нашел эту простую программу в учебнике Youtube, в котором используются модули QtSide с python. В основном, это подключение QLineEdit к QTextBrowser. Как вы можете видеть ниже, вся программа обрабатывается одним классом. У меня есть основная идея функции super(), которая используется в множественном наследовании. Так вот, я не понимаю, что делает оператор super(Form, self).__init__(parent). Я попытался запустить ту же программу после комментирования этого оператора, который появился ниже в сообщении об ошибке.Какова цель использования python `super()`, внутри `__init__`, кроме наследования?

Ошибка: Код

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, который может быть связан с этим. Но мне это непонятно.

ответ

3

super() используется наследование, несколько или иначе, для вызова методов, которые могут быть переопределены в текущем классе.

Здесь super() используется для вызова метода __init__, определенного для QDialog или его родительского класса. Не вызывать оригинал, вероятно, будет иметь последствия, поскольку этот оригинальный метод действительно работает, и вы не хотите его реплицировать в свой собственный метод __init__.

super() делает множественное наследование более легким и более гибким для решения, но это не только для множественного наследования.

+0

поэтому setLayout (макет) является свойством объекта QDialog не так ли? – Srinesh

+0

'self.setLayout()' является методом класса QDialog. –

2

В принципе, super() используется для наследования, как вы уже понимаете. Как упоминалось Martjin, «последствие», появившееся в вашем случае, когда вы прокомментировали это, состоит в том, что требуется инициализация, которая уже была реализована в классе QDialog.

Следовательно, все, что нужно сделать в этом дочернем классе, это вызвать инициализацию родителя.

Здесь уже есть хорошая статья в stackoverflow на super и init здесь.

super and init