什么是函数重载?简单的理解,支持多个同名函数的定义,只是参数的个数或者类型不同,在调用的时候,解释器会根据参数的个数或者类型,调用相应的函数。
重载这个特性在很多语言中都有实现,比如c++、Java等,而Python并不支持。这篇文章呢,通过一些小技巧,可以让Python支持类似的功能。
先看看这种情况下c++是怎么实现重载的
# include & lt; iostream> 使用名称空间性病; int func (int) { cout & lt; & lt;的一个参数& lt; & lt;endl; } int func (int, int b) { cout & lt; & lt;的两个参数& lt; & lt;endl; } int func (int, int, int c) { cout & lt; & lt;三个参数的& lt; & lt;endl; } >之前如果Python按类似的方式定义函数的话,不会报错,只是后面的函数定义会覆盖前面的,达不到重载的效果。
在在在def func(一个): …打印(一个参数) … 在在在def func (a, b): …print(两个参数) … 在在在def func (a, b, c): …print(三个参数) … 在在在函数(1) 回溯(最近的电话): 文件“& lt; stdin>”,1号线& lt; module> TypeError: func()失踪2所需的位置参数:“b”和“c” 在在在func (1、2) 回溯(最近的电话): 文件“& lt; stdin>”,1号线& lt; module> TypeError: func()失踪1所需的位置参数:' c ' 在在在func (1、2、3) 三个参数 >之前但是我们知道,Python函数的形参十分灵活,我们可以只定义一个函数来实现相同的功能,就像这样
在在在def func (* args): …如果len (args)==1: …打印(一个参数) …elif len (args)==2: …print(两个参数) …elif len (args)==3: …print(三个参数) …其他: …打印(错误的) … 在在在函数(1) 一个参数 在在在func (1、2) 两个参数 在在在func (1、2、3) 三个参数 在在在func (1、2、3、4) 错误 >之前
同样,先看下当前情况下c++的重载是怎么实现的
# include & lt; iostream> 使用名称空间性病; int func (int) { cout & lt; & lt;“Int:”& lt; & lt;& lt; & lt;endl; } int func(浮动) { cout & lt; & lt;”浮动:“& lt; & lt;& lt; & lt;endl; } >之前代码中,func支持两种类型的参数:整形和浮点型。调用时,解释器会根据参数类型去寻找合适的函数.Python要实现类似的功能,需要借助functools。singledispatch装饰器。
从functools进口singledispatch @singledispatch def func(一个): 打印(f提出各种方式:{}”) @func.register (int) def _(一个): 打印(f 'Int: {}”) @func.register(浮动) def _(一个): 打印(f 'Float: {}”) if __name__==癬_main__”: func(“打鼾声”) 函数(1) func (1.2) >之前func函数被functools。singledispatch装饰后,又根据不同的参数类型绑定了另外两个函数。当参数类型为整形或者浮点型时,调用绑定的对应的某个函数,否则,调用自身。
执行结果
:打鼾声
引用>
Int: 1
浮:1.2需要注意的是,这种方式只能够根据第一个参数的类型去确定最后调用的函数。
关于singledispatch的更多细节请看官方文档
https://docs.python.org/3.6/library/functools.html functools.singledispatch
注意:函数返回值不同也是重载的一种情况,暂时没有比较好的Python实现方式,所以没有提及
个人觉得,重载就是为了语言的灵活性而设计的,而Python函数本来就有不少巧妙的设计,这个时候去仿这个技术,其实没有多大必要,而且感觉有些违背Python的哲学。所以,本文更多的是在讲如何模仿,而对于重载的使用场景并没有作多少说明。
以上所述是小编给大家介绍的Python函数重载详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
详解Python函数如何重载?