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

2024-10-04 07:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的GUI的实际初始化需要大约150行代码。为了更容易理解,我编写了__init__函数,如下所示:

def __init__(self, root):
    self.root = root
    self._init_menu()
    self._init_connectbar()
    self._init_usertree()
    self._init_remotetree()
    self._init_bottom()

其中_init_menu()_init_connectbar()等执行所有初始化工作。这使我的代码更容易理解,并防止__init__变得太大。在

但是,这会产生范围问题。因为我在_init_connectbar()中定义的条目小部件在函数范围内,不是类属性,所以我不能在类中的其他方法中引用它。在

我可以通过在__init__中执行大部分初始化来消除这些问题,但是我将失去第一个方法获得的抽象。在

我应该扩展__init__,还是寻找其他方法将小部件引入类范围?在


Tags: 模块方法函数代码命令self程序定义
3条回答

为什么不制作你需要引用的小部件,实例变量呢。这是我通常所做的,似乎是一种很常见的方法。在

例如

self.some_widget

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

你可以在我的实例中引用我的观点中的任何变量。与大多数编程语言一样,函数太大时可读性会降低,因此分割初始化代码的方法是一个好主意。在

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

例如:

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

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

相关问题 更多 >