Python中没有构造函数重载 - 缺点?

时间:2012-12-21 11:27:21

标签: python

我正在通过DiveIntoPython并遇到了这个:

  

Java和Powerbuilder通过参数列表支持函数重载,   即一个类可以有多个具有相同名称的方法,但是a   不同数量的参数或不同类型的参数。其他   语言(最着名的是PL / SQL)甚至支持函数重载   参数名称;即一个类可以有多个具有相同的方法   名称和相同类型的相同数量的参数但不同   参数名称。 Python不支持这些;它没有任何形式   功能超载无论如何。方法仅由他们定义   name,每个类只能有一个具有给定名称的方法。所以   如果后代类有__init__方法,它总是覆盖   祖先__init__方法,即使后代用a定义它   不同的参数列表。同样的规则适用于任何其他规则   方法

子类的__init__方法总是覆盖超类的__init__方法,这不是一个主要的缺点吗?因此,如果我正在初始化一些变量并在类class1的{​​{1}}中调用某些函数,那么我派生它的子类__init__,我必须重新初始化所有{ {1}}变量并在class2(class1)的{​​{1}}中调用这些函数?

我很确定我误解了所有这些,所以如果有人澄清这一点会很好。

2 个答案:

答案 0 :(得分:14)

你是正确的,在子类中定义__init__会覆盖超类的__init__,但你总是可以使用super(CurrentClass, self).__init__从子类中调用超类的构造函数。因此,您不必“手动”复制超类的初始化工作。

作为旁注,即使Python不支持方法重载,它也支持默认参数(除了通过*args**kwargs的可选参数),这意味着您可以轻松地模拟行为通过在函数/方法实现中接受不同的参数子集来重载函数。

答案 1 :(得分:2)

  

因此,如果我正在初始化一些变量并在类class1的__init__中调用某些函数,那么我派生它的子类class2(class1),我必须重新初始化所有class1的变量并调用它们class2的__init__

中的函数

没有。你只需要调用超类的__init__()Herehere,您可以找到如何操作。