6

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

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

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

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

4

2 回答 2

14

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

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

于 2012-12-21T11:32:19.900 回答
2

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

不,你只需要调用超类的__init__(). 在这里在这里,你可以找到如何去做。

于 2012-12-21T11:41:17.780 回答