Python 一个非常大的初始化有什么问题吗?

Python 一个非常大的初始化有什么问题吗?,python,oop,scope,initialization,abstraction,Python,Oop,Scope,Initialization,Abstraction,我正在用Tkinter模块构建的GUI编写一个Python程序。我使用一个类来定义GUI,因为它可以更容易地将命令传递给按钮,并使整个过程更容易理解 GUI的实际初始化需要大约150行代码。为了便于理解,我编写了\uuuu init\uuu函数,如下所示: def __init__(self, root): self.root = root self._init_menu() self._init_connectbar() self._init_usertree(

我正在用Tkinter模块构建的GUI编写一个Python程序。我使用一个类来定义GUI,因为它可以更容易地将命令传递给按钮,并使整个过程更容易理解

GUI的实际初始化需要大约150行代码。为了便于理解,我编写了
\uuuu init\uuu
函数,如下所示:

def __init__(self, root):
    self.root = root
    self._init_menu()
    self._init_connectbar()
    self._init_usertree()
    self._init_remotetree()
    self._init_bottom()
其中,
\u init\u menu()
\u init\u connectbar()
等执行所有初始化工作。这使我的代码更容易理解,并防止
\uuuu init\uuu
变得太大

但是,这会产生范围问题。由于我在
\u init\u connectbar()
中定义的条目小部件位于函数范围内,并且不是类属性,因此我无法在类中的其他方法中引用它

我可以通过在
\uuuu init\uuuu
中进行大部分初始化来解决这些问题,但我将失去使用第一个方法得到的抽象


我应该扩展
\uuuuu init\uuuuuuu
,还是找到另一种方法将小部件引入类范围?

您应该查看此类内容的详细信息。如果您的GUI很复杂,那么在描述它时会有一些复杂性。无论这是一个复杂的函数还是某个文件中的复杂描述,归结起来都是一样的。您可以尝试使其尽可能可读和可维护,根据我的经验,生成器模式在这方面确实很有帮助。

在我看来,您应该将小部件存储为实例变量,以便您可以从任何方法引用它们。与大多数编程语言一样,当函数变得太大时,可读性会降低,因此拆分初始化代码的方法是一个好主意

当类本身对于一个源文件来说太大时,您还可以使用mix-in-classes(类似于在C#中使用分部类)拆分该类

例如:

class MainGuiClass(GuiMixin_FunctionalityA, GuiMixin_FunctionalityB):
    def __init__(self):
        GuiMixin_FunctionalityA.__init__(self)
        GuiMixin_FunctionalityB.__init__(self)

当GUI由不同的功能组成时(例如配置选项卡、执行选项卡或其他任何功能),这很方便。

将一些小部件引用存储在实例变量中或返回它们(这是一个最小的设置;您希望减少耦合)并将它们存储在
的局部变量中,然后将相关变量作为参数传递给后续的构造帮助程序。后者更干净,但需要充分解耦,以便您可以创建一个使之成为可能的顺序。

为什么不创建您需要引用的小部件,例如实例变量。这是我经常做的事情,似乎是一种很常见的方法

e、 g


谢谢,这才是我真正应该做的。我想我会让每个
\u init\u something
返回它初始化的小部件。@Rafe:只是“有趣的”小部件。GUI通常还有其他一些不感兴趣的东西,比如标签和框架;它们就像有趣的小部件(条目、列表框、画布等)所扮演的角色。(当然,有时条目不是很有趣,标签也很有趣,但这取决于您正在构建的GUI的细节…)我想我可以在
\uuuuuu init\uuuuuu
中定义每个小部件,然后运行方法来对每个小部件进行实际配置和打包。这与我的建议不完全一致。虽然我通常有一个单独的方法来进行布局,但您仍然可以在
\uuuu init\uuuu widget()
方法中定义您的小部件,但是使您的小部件实例变量意味着您可以在其他地方访问它们。回答得好,但您有点太谨慎了。所有编程语言中的大型函数的可读性都会降低。哇。我早该料到会有人来:)
self.some_widget