gpt4 book ai didi

Python 在 init 之外定义 gui 变量

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:19 24 4
gpt4 key购买 nike

我正在使用PySide2定义我的工具的接口(interface),我通常初始化 __init__ 之外的所有接口(interface)项为了不使其膨胀(任何其他重要变量都保留在 __init__ 中)。

对我来说不幸的是,我使用 PyCharm 作为我的编辑器,它给了我大量警告:

Instance attribute 'foobar' defined outside __init __

这是我将要做的事情的一个简单示例:

from PySide2 import QtWidgets


class MyTool(QtWidgets.QWidget):

def __init__(self, parent=None):
super(MyTool, self).__init__(parent)

self.create_gui()

def create_gui(self):
# Complains about all variables below!

self.awesome_checkbox = QtWidgets.QCheckBox(parent=self)

self.awesome_button = QtWidgets.QPushButton(parent=self)

self.awesome_label = QtWidgets.QLabel(parent=self)

self.main_layout = QtWidgets.QVBoxLayout()
self.main_layout.addWidget(self.awesome_checkbox)
self.main_layout.addWidget(self.awesome_button)
self.main_layout.addWidget(self.awesome_label)
self.setLayout(self.main_layout)

现在我知道一种解决方案是在 __init__ 中初始化这些变量如None ,但我可以有相当复杂的接口(interface),所以它会很冗长。

我的问题是我现在所做的事情是否真的亵渎?我知道这些变量在技术上是在 __init__ 之外的,但该方法仍然在构造函数中被调用!

最佳答案

嗯,简短的回答是:不,这不是“真正的亵渎”。

创建所有实例属性并确保它们在初始化程序中处于一致状态被认为是一种很好的做法,因为它使代码更易于阅读(您只有一种方法可以读取来了解对象具有哪些属性)并避免潜在的潜在风险当通过在访问该属性之前可能并不总是调用的方法创建属性时,会出现 AttributeError。这就是为什么大多数 linter 会(默认情况下)警告您这一点,这本身就是一件好事,因为它可以帮助您在潜在的错误进入生产之前发现它。

现在确实存在这样的情况,将实例初始化的一部分委托(delegate)给不同的方法是有意义的,即当这些属性相互依赖以及某些其他外部因素时,并且可能必须在实例的生命周期中一起重置/更新,或者当您想让子类重写这部分初始化而不必重写 __init__() 时方法本身(参见 GOF 的“模板方法”模式)。

对于具有复杂初始化的类(这是 GUI 组件的典型情况),出于可读性原因,将设置拆分为不同的方法也是有意义的 - 50 多行初始化程序并不是真正的最佳选择可读性 - 所以就我而言,我可能会做类似的事情,并可能进行一些改进:首先将其设为“ protected ”方法(将其命名为 _create_gui() - 前导下划线是 protected 属性/方法的命名约定)然后添加一个防护以防止该方法被执行两次(假设该方法只应该从初始化程序中调用一次,并且当然不应该是公共(public) API 的一部分)。然后我会添加几个 linter 指令(这些是 linter 寻找的特殊格式的注释),以向 linter 和阅读此代码的任何人表明这样做是有意的设计选择,而不是菜鸟错误。

关于Python 在 init 之外定义 gui 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53758217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com