为什么 PySide/PyQt 中使用了如此多的 super?

2024-01-22

简短版本(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。我的问题是:我应该使用superPySide 脚本?

看起来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/20​​08-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


以传统方式实例化父类并没有什么问题,而且有些事情值得说一下。也就是说,使用super简化了子类的创建以及 PySide 代码的未来修改,人们似乎已经将后者视为最重要的因素。这并不是特定于 Pyside,而是更普遍地适用于 Python 中的面向对象编程(正如 Kos 的优秀答案所指出的)。

简化代码修改的潜力是因为在 PySide 中,有必要根据其他内容来定义子类QtGui对象(例如,QtQui.QMainWindow and QtGui.QWidget)。此外,人们倾向于充分利用他们的父类,因此使用起来似乎更容易super,这样你就不必在每次改变父母时更新你的 __init__ 方法。

所以这不是使用的问题super为了帮助解决多重继承的情况,大多数人都认为它可能是最合适的情况。相反,问题是在 __init__ 中做更少的工作,以防您的父类将来发生变化。

以下是每位作者的回复,他们都写了我认为很好的 PySide 教程:

作者1:

我认为这是一个品味问题。早期教程(PyQt 和 PySide) 用过的 。init后来我改用super()。我个人 更喜欢 super()。

作者2:

人们使用 super 而不是 .init(...) 是为了 如果您更改父类的内容,请避免进行更改,例如如果 你从QVBoxLayout切换到QHBoxLayout,你只需要改变它 在类定义行中,而不是在init方法如 出色地。

所以你有它。这些好处并不是 PySide 特有的,而是更普遍地编写子类/继承的好处。

我不确定卢茨在说什么,他似乎很犹豫是否支持使用super,会说(也许使用super违反了“显式优于隐式”的格言)。

四年后更新
回想起来,这场辩论已经结束了,这个问题几乎很奇怪(这是我在 SO 上的第一个问题)。虽然过去对于使用super,这些争论已经结束了。特别是在Python 3中super其便利性已得到证明,并且使您的代码更易于维护。因为在 Qt/Pyside/PyQt 框架中,从更抽象的 Qt 类继承的使用是普遍存在的,这是一个不小的特性。当然,当你有疯狂的继承格子时,你需要小心,但坦率地说,自从我问这个问题以来,我实际上从未遇到过这个问题,我目前使用super在我所有的代码中。它arguably违反了“显式优于隐式”的格言,但“简单优于复杂”和“实用性胜过纯粹性”是这里最重要的因素(这里的实用性是“可维护性很重要”)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PySide/PyQt 中使用了如此多的 super? 的相关文章

  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 在 matplotlib 中的极坐标图上移动径向刻度标签

    From matplotlib 示例 http matplotlib org examples pylab examples polar demo html import numpy as np import seaborn as sbs
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • Django Admin 中的反向内联

    我有以下 2 个型号 现在我需要将模型 A 内联到模型 B 的页面上 模型 py class A models Model name models CharField max length 50 class B models Model n
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS

随机推荐