Python 惯例:我通常应该调用超级 class' __init__ 吗?
Python convention: should I normally call the super class' __init__?
我阅读了 this question 的最高评分答案,它说如果需要,我们应该调用超级 class' __init__
,但我们不必这样做。但我的问题更多是关于惯例。
我是否应该通常,作为一般规则,总是在我的class'[=13]中调用超级class'__init__
=],无论我目前是否 'need' 该方法中的功能?
有些 classes 需要调用它们的 __init__
方法才能工作。他们使用 __init__
方法设置所需的属性。
示例:
class one ():
def __init__ (self):
self.number = 20
def show_number(self):
return self.number
如果继承上述class,则需要调用其__init__
方法来定义属性number
。如果未调用 __init__
方法,则在尝试调用方法 show_number
时可能会出错。
至于语法,如果继承class的__init__
方法没有任何反应,则不需要调用它。如果您认为不调用 __init__
方法会使其他人感到困惑,您可以随时用评论来解释您的推理。即使你不需要它,调用它也没有任何坏处。
这个答案有一些反对票,因为反对票的人在焦点上不同意我的观点,也许 "convention" 的意思。我认为我们在编写代码时大多同意实际做法。
不。你不应该通常,作为一般规则,总是调用超级class的__init__
在你的 class 的 __init__
, 不管你目前是否 "need" 该方法中的功能 .
但请注意,我强调的是最后一个短语,从 "regardless" 开始, 是我的 "no" 回答要解决的问题.您不应该在 Python 代码 "just because someone told you to" 或 "just because that seems to be what most people are doing".
中添加一些东西
如果需要,你应该包括一些东西,如果不需要,就不要包括一些东西。
经常是这种情况,有些人会争辩说 通常 是这种情况,您 确实 想调用 super class 的 __init__
方法在你的 subclass 的 __init__
方法中。 我大部分时间都是自己做的。
但是为什么呢?
重要的是,它 而不是 因为某些 "convention"。我这样做是因为我的 subclass normally 需要与 superclass 相同的初始化,外加一些额外的定制。请注意,额外的自定义是首先覆盖 __init__
的全部原因。如果你的 subclass 的初始化与 superclass 的初始化相同,那么你根本不应该定义你自己的 __init__
。
Python 中没有约定对您不需要的内容进行编码。有些人有 他们自己的 惯例来包含不必要的东西;也许以 "defensive programming" 的名义,或者因为它们习惯于需要更多样板的不同语言。
当您可以选择多种方式来表达一些有用的东西时,Python 的约定就派上用场了。 Python确实不强调简洁高于一切。但这也不意味着它也强调冗长。所以让我补充一下,以防不清楚:
您应该通常,作为一般规则,始终避免不必要的样板代码。 (而且不仅仅是 Python。)
[对于那些认为短语 "normally always" 尴尬或荒谬的人:我完全同意,但我试图通过重复提问者自己选择的词语来强调我的观点。]
是。作为一般规则,您应该从subclass 的 __init__
方法。这不是 Python 约定,而是 OO 最佳实践建议您应该做的(考虑到您碰巧使用的语言,这个决定由您自己决定):
superclass 不知道 subclass,但是 subclass 应该知道它继承的 superclass 的语义从。最终由 subclass 来维护一个真正的 sub-typing 的一致行为(不幸的是,Python 语言对程序员帮助不大)。作为 subclass 实现者,您可以决定是否需要调用 superclass __init__
,就像您可以决定是否 do/don need/want 来调用 superclass 对您覆盖的任何方法的实现。但是,对象的初始化往往是许多对象 life-cycle 中非常重要的一步。在对象被初始化之前,可以争辩说对象不是给定 class 的真正实例。在〜所有理智的 OO 语言中,这是一个隐含且重要的 post-condition,当您实例化一个对象时,某些事情已经发生,我们可以 依赖 那些已经发生的事情,初始化(或"construction" 在其他语言中)是核心——无论它涉及复杂的参数验证和计算值生成,还是仅仅是一个空操作。因此,如果你不调用 super 的初始化器,你最好清楚自己要做什么。
作为一般规则调用 super 的 __init__
的另一个论点是,如果您没有编写 superclass,或者您没有严格控制版本,[=10= 的实现] 将来可能会改变(向 __init__
添加某些内容是否需要主版本号?我不确定,但我敢打赌很多人不会为此增加主版本号,即使从技术上讲他们应该).因此,如果您调用 super 的 __init__
,您的代码不太可能因更新 superclass 实现而中断。
更新: 在回答这个问题之前应该阅读 linked question。那里的大多数答案都与这里的一般情绪相呼应——也许不像我那样用相同的术语或强烈支持将 __init__()
称为一般规则。但我会把这个答案留给落在这里的其他人。
我阅读了 this question 的最高评分答案,它说如果需要,我们应该调用超级 class' __init__
,但我们不必这样做。但我的问题更多是关于惯例。
我是否应该通常,作为一般规则,总是在我的class'[=13]中调用超级class'__init__
=],无论我目前是否 'need' 该方法中的功能?
有些 classes 需要调用它们的 __init__
方法才能工作。他们使用 __init__
方法设置所需的属性。
示例:
class one ():
def __init__ (self):
self.number = 20
def show_number(self):
return self.number
如果继承上述class,则需要调用其__init__
方法来定义属性number
。如果未调用 __init__
方法,则在尝试调用方法 show_number
时可能会出错。
至于语法,如果继承class的__init__
方法没有任何反应,则不需要调用它。如果您认为不调用 __init__
方法会使其他人感到困惑,您可以随时用评论来解释您的推理。即使你不需要它,调用它也没有任何坏处。
这个答案有一些反对票,因为反对票的人在焦点上不同意我的观点,也许 "convention" 的意思。我认为我们在编写代码时大多同意实际做法。
不。你不应该通常,作为一般规则,总是调用超级class的__init__
在你的 class 的 __init__
, 不管你目前是否 "need" 该方法中的功能 .
但请注意,我强调的是最后一个短语,从 "regardless" 开始, 是我的 "no" 回答要解决的问题.您不应该在 Python 代码 "just because someone told you to" 或 "just because that seems to be what most people are doing".
中添加一些东西如果需要,你应该包括一些东西,如果不需要,就不要包括一些东西。
经常是这种情况,有些人会争辩说 通常 是这种情况,您 确实 想调用 super class 的 __init__
方法在你的 subclass 的 __init__
方法中。 我大部分时间都是自己做的。
但是为什么呢?
重要的是,它 而不是 因为某些 "convention"。我这样做是因为我的 subclass normally 需要与 superclass 相同的初始化,外加一些额外的定制。请注意,额外的自定义是首先覆盖 __init__
的全部原因。如果你的 subclass 的初始化与 superclass 的初始化相同,那么你根本不应该定义你自己的 __init__
。
Python 中没有约定对您不需要的内容进行编码。有些人有 他们自己的 惯例来包含不必要的东西;也许以 "defensive programming" 的名义,或者因为它们习惯于需要更多样板的不同语言。
当您可以选择多种方式来表达一些有用的东西时,Python 的约定就派上用场了。 Python确实不强调简洁高于一切。但这也不意味着它也强调冗长。所以让我补充一下,以防不清楚:
您应该通常,作为一般规则,始终避免不必要的样板代码。 (而且不仅仅是 Python。)
[对于那些认为短语 "normally always" 尴尬或荒谬的人:我完全同意,但我试图通过重复提问者自己选择的词语来强调我的观点。]
是。作为一般规则,您应该从subclass 的 __init__
方法。这不是 Python 约定,而是 OO 最佳实践建议您应该做的(考虑到您碰巧使用的语言,这个决定由您自己决定):
superclass 不知道 subclass,但是 subclass 应该知道它继承的 superclass 的语义从。最终由 subclass 来维护一个真正的 sub-typing 的一致行为(不幸的是,Python 语言对程序员帮助不大)。作为 subclass 实现者,您可以决定是否需要调用 superclass __init__
,就像您可以决定是否 do/don need/want 来调用 superclass 对您覆盖的任何方法的实现。但是,对象的初始化往往是许多对象 life-cycle 中非常重要的一步。在对象被初始化之前,可以争辩说对象不是给定 class 的真正实例。在〜所有理智的 OO 语言中,这是一个隐含且重要的 post-condition,当您实例化一个对象时,某些事情已经发生,我们可以 依赖 那些已经发生的事情,初始化(或"construction" 在其他语言中)是核心——无论它涉及复杂的参数验证和计算值生成,还是仅仅是一个空操作。因此,如果你不调用 super 的初始化器,你最好清楚自己要做什么。
作为一般规则调用 super 的 __init__
的另一个论点是,如果您没有编写 superclass,或者您没有严格控制版本,[=10= 的实现] 将来可能会改变(向 __init__
添加某些内容是否需要主版本号?我不确定,但我敢打赌很多人不会为此增加主版本号,即使从技术上讲他们应该).因此,如果您调用 super 的 __init__
,您的代码不太可能因更新 superclass 实现而中断。
更新: 在回答这个问题之前应该阅读 linked question。那里的大多数答案都与这里的一般情绪相呼应——也许不像我那样用相同的术语或强烈支持将 __init__()
称为一般规则。但我会把这个答案留给落在这里的其他人。