繁体   English   中英

Python惯例:我通常应该调用超类'__init__吗?

[英]Python convention: should I normally call the super class' __init__?

我读了这个问题得分最高的答案,它说如果我们需要,我们应该调用超级班级' __init__ ,而我们不需要。 但我的问题更多是关于惯例。

如果我通常情况下 ,作为一般规则,总是调用父类的__init__在我的课__init__ ,无论与否我目前‘需要’该方法中的功能?

有些类需要调用它们的__init__方法才能工作。 他们使用__init__方法设置所需的属性。

例:

class one ():
    def __init__ (self):
        self.number = 20
    def show_number(self):
        return self.number

如果从上面的类继承,则需要调用其__init__方法以定义属性number 如果未调用__init__方法,则在尝试调用方法show_number时可能会出错。

至于语法,如果继承类的__init__方法没有任何反应,则不需要调用它。 如果您认为不调用__init__方法会使其他人感到困惑,您可以随时用注释解释您的推理。 即使您不需要它也不会对它进行任何伤害。

这个答案有一些贬低,因为贬低者在焦点上不同意我,也许在“惯例”意味着什么。 我认为在编写代码时我们大多同意实际的做法。


,你不应该通常情况下 ,作为一般规则,总是调用父类的__init__在类的__init__不管你是否当前“需要”的功能,但其方法

但请注意,我的重点是最后一句,从“不管”开始, 就是我的“不”答案的意思。 你不应该在你的Python代码中抛出一些东西“只是因为有人告诉你”或“只是因为这似乎是大多数人正在做的事情”。

如果需要,你应该包括一些东西,如果不需要,你不应该包括一些东西。

通常情况下,有些人会认为通常情况下,您确实希望在子类的__init__方法中调用超类的__init__方法。 我大部分时间都是这样做的。

但为什么?

至关重要的是,这不是因为一些“惯例”。 我这样做是因为我的子类通常需要与超类相同的初始化,以及一些额外的自定义。 请注意,额外的自定义是首先覆盖__init__的全部原因。 如果你的子类的初始化意味着与超类的初始化相同,那么你根本就不应该定义自己的__init__


在Python中编写一些你不需要的代码并不是一种惯例。 有些人有自己的惯例来包含不必要的东西; 也许是以“防御性编程”的名义,或者因为它们被用于需要更多样板的不同语言。

Python的约定出现在你可以选择多种表达有用的方法之间。 的确,Python并不强调简洁性。 但这并不意味着它也强调冗长。 所以,我要补充一下,以防不清楚:

作为一般规则,您通常应该始终避免使用不必要的样板代码。 (而不只是在Python中。)

[对于那些认为“通常总是”这句话很尴尬或荒谬的人:我完全同意,但我试图通过重复提问者自己选择的词来强调我的观点。

是。 作为一般规则,你应该调用父类的__init__从子类的__init__方法。 这不是Python惯例,它是OO最佳实践建议您应该做的事情(考虑到您恰好使用的语言,将此决定留给您):

超类不了解子类,但是子类应该知道它继承的超类的语义。 最终,由子类来维护真正的子类型的一致行为(遗憾的是,Python语言对程序员的帮助不大)。 作为子类实现者,您可以决定是否需要调用超类__init__ ,就像您决定是否需要/想要调用超类的任何方法的实现一样。 但是,对象的初始化往往是许多对象生命周期中非常重要的一步。 在对象初始化之前,可以说对象不是真正的给定类的实例。 在所有理智的OO语言中,这是一个隐含且重要的后置条件,当您实例化某个对象时,某些事情已经发生,我们可以依赖于已经发生的事情,初始化(或其他语言中的“构造”)是中心事物 -它是否涉及复杂的参数验证和计算值生成,或者只是一个空操作。 因此,如果你不打电话给super的初始化程序,你最好知道你的用途。

调用super的__init__作为一般规则的另一个论点是,如果你没有编写超类,或者你没有严格控制版本, __init__的实现可能会在未来发生变化(是否会为__init__添加一些东西来调用主要的版本?我不确定,但我敢打赌,很多人不会因此而碰到主要版本号,即使技术上他们应该这样做。 因此,如果您调用super的__init__您的代码不太可能与超类实现的更新中断。


更新:在回答此问题之前,应该已阅读链接的问题。 那里的大多数答案都与这里的一般情绪相呼应 - 也许不是以相同的术语或强烈支持调用__init__()作为一般规则。 但我会把这个答案留给落在这里的其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM