Краткая версия (tl; dr)
Я изучаю PySide, и большинство онлайн-руководств используют super
для инициализации элементов пользовательского интерфейса. Является ли это важным (т.е. Более масштабируемым), или это вопрос вкуса?
Разъяснение: как я более подробно изложена в подробной версии, это еще не один общий вопрос, когда следует использовать super
(это было сделано раньше). Скорее, учитывая количество обучающих программ PySide, которые используют super
вместо <class>.__init__
, я пытаюсь выяснить, является ли использование super
стандартным в приложениях PySide? Если да, то это потому, что обстоятельства, при которых super
вызывается (с разрешающим наследованием), особенно сильно зависят от использования PySide/PyQt? Или это вопрос вкуса.
Подробная версия
Я новичок в Python и в настоящее время изучаю PySide с помощью учебника Zets (http://zetcode.com/gui/pysidetutorial/firstprograms/). Второй пример в учебнике включает в себя:
from PySide import QtGui
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(300,300,250,150)
self.setWindowTitle("PySide 101: Window the First!")
self.show()
app=QtGui.QApplication(sys.argv)
ex=Example()
sys.exit(app.exec_())
Это отлично работает, но я никогда не использовал super
. Следовательно, я переписал вышеуказанный код, успешно заменив super
более стандартным явным вызовом родительского класса:
QtGui.QWidget.__init__(self)
Но поскольку я ищу в Интернете учебные руководства PySide (например, http://qt-project.org/wiki/PySide-Newbie-Tutorials), все они включают вызовы super
. Мой вопрос: должен ли я использовать super
для PySide-скриптов?
Кажется, что super
представляется наиболее полезным, когда у вас есть наследование бриллиантов, что он имеет тенденцию разрешать экземпляры множественного наследования разумным способом. Является ли super
много использовать с PySide, потому что есть преобладание случаев таких бриллиантов, с которыми я столкнусь с более реалистичными сложными примерами? [Изменить: Нет: см. Мой ответ ниже.]
Почему я даже спрашиваю? Почему бы просто не использовать super
и сделать с ним?
Я спрашиваю, потому что книга, которую я использую для изучения Python (Learning Python, by Lutz), тратит более 20 страниц на тему super
и явно предостерегает от ее использования. Он предлагает, чтобы новые пользователи Python использовали более традиционный явный маршрут, прежде чем возиться с ним (например, см. Стр. 832 и страницы 1041-1064 Learning Python, 5th Edition). Он в основном рисует его как непитонический, тайный, редко на самом деле необходимый, новый стиль, с которым следует относиться с большой осторожностью, когда только начинаешь, и думает, что он чрезмерно используется опытными пользователями.
Кроме того, глядя на исходный код двух основных проектов на основе PySide/PyQt (Spyder и pyqtgraph), не используется super
. Один (Spyder) явно сообщает вкладчикам, чтобы избежать использования его по соображениям совместимости (http://code.google.com/p/spyderlib/wiki/NoteForContributors).
Примечание. Я ссылаюсь на близкую статью ниже, но ответ там обсуждается более широко, когда вы хотели бы использовать super
(когда у вас есть множественное наследование). Мой вопрос заключается в том, оправдывает ли PySide или даже требует использования super
в долгосрочной перспективе, или же он более Pythonic и, лучше, по соображениям совместимости, явно указывает родительские классы? Или это вопрос вкуса?
Если это неодобрительно (как предлагает моя книга для начинающих), почему это так повсеместно в учебниках PySide, направленных на новичков? Если это имеет какое-то значение, кажется, что люди, пишущие эти учебники, являются опытными программистами на Java или обслуживают таких программистов. Не я.
Связанные темы
http://www.riverbankcomputing.com/pipermail/pyqt/2008-January/018320.html