Python中没有构造函数重载-缺点是什么?
我在浏览DiveIntophon时遇到了这样一个问题: Java和Powerbuilder支持通过参数列表进行函数重载, i、 一个类可以有多个同名的方法,但是 不同数量的参数,或不同类型的参数。其他 语言(尤其是PL/SQL)甚至支持函数重载 参数名;i、 e.一个类可以有多个具有相同属性的方法 名称和相同类型但不同的相同数量的参数 参数名。Python都不支持这两种方法;它没有任何形式的 函数重载。方法仅由其属性定义 名称,并且具有给定名称的每个类只能有一个方法。所以 如果子类具有Python中没有构造函数重载-缺点是什么?,python,Python,我在浏览DiveIntophon时遇到了这样一个问题: Java和Powerbuilder支持通过参数列表进行函数重载, i、 一个类可以有多个同名的方法,但是 不同数量的参数,或不同类型的参数。其他 语言(尤其是PL/SQL)甚至支持函数重载 参数名;i、 e.一个类可以有多个具有相同属性的方法 名称和相同类型但不同的相同数量的参数 参数名。Python都不支持这两种方法;它没有任何形式的 函数重载。方法仅由其属性定义 名称,并且具有给定名称的每个类只能有一个方法。所以 如果子类具有\uuuu
\uuuu init\uuu
方法,则它总是重写
祖先\uuuu init\uuuu
方法,即使后代使用
不同的参数列表。同样的规则也适用于任何其他情况
方法
子类的\uuu init\uuu
方法总是覆盖超类的\uu init\uu
方法,这难道不是一个主要的缺点吗?因此,如果我在初始化一些变量并调用类class1
的\uuu init\uuu
中的一些函数,那么我将派生一个子类class2(class1)
,我必须重新初始化所有class1
的变量并调用class2
的\uu init\ucode>中的那些函数
我很确定我误解了这一切,所以如果有人能澄清这一点,那就太好了。你是对的,在子类中定义\uuuuu init\uuuuu
会覆盖超类的\uu init\uuuuuuu
,但是你总是可以使用super(CurrentClass,self)。\uu init\uuuuu
从子类调用超类的构造函数。因此,您不必“手动”复制超类的初始化工作
作为旁注,即使Python不支持方法重载,它也支持默认参数(除了通过*args
和**kwargs
的可选参数之外),这意味着您只需在函数/方法实现中接受不同的参数子集,就可以轻松地模拟重载函数的行为
因此,如果我在初始化一些变量并调用类class1的\uuuuu init\uuuuu
中的一些函数,那么我将派生它的一个子类class2(class1),我必须重新初始化所有class1的变量,并调用类2中的\uuuu init\uuuuu
中的那些函数
不需要。只需调用超类的\uuu init\uuu()
,而且,您可以找到如何执行此操作。如果您使用*args
/**kwdargs**
方法对特定函数执行一些分派,那么您会意识到,实际上使用不同的函数名称并没有什么坏处:)@tom当然我这么做了,super是一个新词吗?我正在尝试,因为我在这台机器中没有python,super
是在Python2.2中添加的(不久前)。您使用的Python版本必须比这个版本旧。@tomsuper
在所有情况下都不能工作,它必须是一个新样式的类,这就是我出错的原因<代码>基类。uu初始化(self)
将起作用。测试用例:,,“您只需在函数/方法实现中接受不同的参数子集,就可以轻松地模拟重载函数的行为。”但请对此负责。不要试图将完全不同的函数签名塞进单个函数中。