详解Python函数如何重载?

  

什么是函数重载?简单的理解,支持多个同名函数的定义,只是参数的个数或者类型不同,在调用的时候,解释器会根据参数的个数或者类型,调用相应的函数。

  

重载这个特性在很多语言中都有实现,比如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函数如何重载?