一个非常大的__init__有什么问题吗?

Raf*_*ler 5 python oop scope abstraction initialization

我正在编写一个带有使用Tkinter模块构建的GUI的Python程序.我正在使用一个类来定义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()
Run Code Online (Sandbox Code Playgroud)

where _init_menu(),_init_connectbar()等等进行所有初始化工作.这使我的代码更容易遵循,并防止__init__变得太大.

但是,这会产生范围问题.由于我定义的Entry小部件_init_connectbar()位于函数作用域中而不是类属性,因此我无法在类中的其他方法中引用它.

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

我应该扩展__init__,还是找到另一种方法将小部件带入类范围?

Don*_*ows 5

在实例变量中存储其中一些窗口小部件引用或返回它们(一个最小的设置提示你;你想要Reduce Coupling)并将它们存储在局部变量中,__init__然后将相关的那些作为参数传递给后续的构造助手.后者更干净,但要求事物足够分离,以便您可以创建使其成为可能的排序.


vol*_*ing 2

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

例如

self.some_widget
Run Code Online (Sandbox Code Playgroud)