Python - 为什么要在 __init__() 中调用方法?

3

我一直在查看一些关于PyQt4的教程,它很好,但我不太明白为什么创建对象时的语法是这样的:

class Example(QtGui.QMainWindow):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):               

        #code to set up instance variables and show() the window

做到这一点,与完全消除self.initUI()调用并只将设置属性的任何代码放在super被调用后的__init__()中有什么确切的收益?

1
最有可能是为了可读性和重用性。 - timc
1
在许多编程语言中,这是为了在多个构造函数之间重用代码而完成的。如果您想在某个时刻重新初始化对象,它也可能非常有用。 - Chris Hayes
或者在子类中覆盖该方法,不调用 initUI 方法,或以不同的方式调用它。 - tripleee
确实,为什么要调用方法呢。很抱歉我问了一个你可能已经知道答案的问题。 - user890167
3个回答

14
有时为了提高可读性,代码会被分成函数。
如果对象初始化需要三个步骤,那么逻辑上将其分成三个函数是有意义的。这些函数的名称可以描述它们处理的初始化部分。
另一个调用“init”函数的原因是从真正的 __init__ 函数中恢复对象到新状态;在这种情况下,你可能想要从 __init__ 外部调用 "clean" 函数,比如在对象池中。
你在问题中也暗示了重用的第三个原因:如果子类需要更改初始化发生的顺序(或完全省略/替换某些部分!),则使用单块式的 __init__ 不可能实现,但是如果将其拆分成不同部分就很容易实现。
第四个和最后一个原因是为了进行性能分析。如果你跟踪函数的进入/退出和时间,拆分函数可以在时间度量方面提供更细粒度的精度。
无论如何,编码方式由你决定 - 但是你在这里提出的方法确实具有优点。

感谢您提供清晰的答案。现在我明白了,当然这一切都变得非常合理 :) - user890167

0

可能是为了能够再次调用initUI函数。


0

我只知道一个原因,和大多数编程语言一样——可用性。面向对象编程的核心是能够重复使用事物——无论是类、方法还是变量。通过分离不同的方法/函数,我们可以在以后调用它们。你是否会在以后调用它们……这是有争议的。我认为这归结于良好的编程实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接