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

use*_*125 6 python

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

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

这不是一个主要的缺点,子类的__init__方法总是会覆盖超类的__init__方法吗?所以,如果我初始化一些变量和类调用一些功能class1的__init__,然后我得到一个子类class2(class1)的话,我不得不重新初始化所有class1的变量,并调用这些功能class2的__init__?

我很确定我误解了这一切,所以如果有人澄清这一点,那就太好了.

tom*_*tom 14

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

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

  • @tom`super`在所有情况下都不起作用,它必须是一个新的样式类,这就是我收到错误的原因.`BaseClass .__ init __(self)`会起作用.测试用例:[直接电话](http://ideone.com/IJperH),[失败的超级电话](http://ideone.com/jLAQ8b),[在新式课程中成功超级电话](http:// ideone.com/zEV8PX),[直接调用新风格](http://ideone.com/Ad3oxL) (3认同)