简短版本(tl;dr)
我正在学习PySide,大多数在线教程都使用super
初始化 UI 元素。这很重要(即更具可扩展性),还是一个品味问题?
澄清:正如我在详细版本中更清楚地说明的那样,这不是另一个询问何时使用的通用线程super
(这之前已经做过)。相反,考虑到使用的 PySide 教程的数量super
代替<class>.__init__
,我想弄清楚是否使用super
是 PySide 应用程序的标准吗?如果是这样,是否是因为当时的情况super
在使用 PySide/PyQt 时,特别需要(涉及解决继承)出现很多?或者这是一个品味问题。
详细版本
我是 Python 新手,目前正在使用 Zets 教程学习 PySide (http://zetcode.com/gui/pysidetutorial/firstprograms/ 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 http://qt-project.org/wiki/PySide-Newbie-Tutorials), they all包括调用super
。我的问题是:我应该使用super
PySide 脚本?
看起来super
当您拥有继承钻石时似乎最有帮助,因为它倾向于以合理的方式解决多重继承的实例。是super
大量使用 PySide 是因为存在大量此类钻石的情况,我将面临更现实的复杂示例?[编辑:否:请参阅下面我的回答。]
我为什么还要问?为什么不直接使用super
就这样结束了吗?
我这么问是因为我用来学习 Python 的书(Learning Python,作者 Lutz)花了 20 多页来讨论以下主题:super
, and 明确警告不要使用它。他建议新的 Python 用户在搞乱它之前先采用更传统、更明确的路线(例如,参见《学习 Python,第五版》第 832 页和第 1041-1064 页)。他基本上将其描述为一种非 Python 的、神秘的、很少实际需要的新风格,在刚开始时应该非常谨慎地对待,并且认为它被有经验的用户过度使用。
此外,查看两个主要的基于 PySide/PyQt 的项目(Spyder 和 pyqtgraph)的源代码,两者都没有使用super
。其中一个(Spyder)明确告诉贡献者出于兼容性原因避免使用它(http://code.google.com/p/spyderlib/wiki/NoteForContributors http://code.google.com/p/spyderlib/wiki/NoteForContributors).
请注意,我链接到下面密切相关的帖子,但那里的答案更广泛地讨论了您何时想要使用super
(当您有多重继承时)。我的问题是 PySide 脚本是否合理,甚至需要使用super
从长远来看,或者显式命名父类是否更Pythonic,并且出于兼容性原因更好?或者这是一个品味问题?
如果它不受欢迎(正如我的初学者书籍所建议的那样),为什么它在针对初学者的 PySide 教程中如此普遍?如果说有什么不同的话,那么编写这些教程的人似乎都是经验丰富的 Java 程序员,或者是为此类程序员服务的。我不是。
相关话题
http://www.riverbankcomputing.com/pipermail/pyqt/2008-January/018320.html http://www.riverbankcomputing.com/pipermail/pyqt/2008-January/018320.html
PyQt4 使用 __init__ 的不同方式 https://stackoverflow.com/questions/11597436/different-ways-of-using-init-for-
理解 Python super() 和 __init__() 方法 https://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods?rq=1