详解Python 函数如何重载?


Posted in Python onApril 23, 2019

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

重载这个特性在很多语言中都有实现,比如 C++、Java 等,而 Python 并不支持。这篇文章呢,通过一些小技巧,可以让 Python 支持类似的功能。

参数个数不同的情形

先看看这种情况下 C++ 是怎么实现重载的

#include <iostream>
using namespace std;

int func(int a)
{
	cout << 'One parameter' << endl;
}

int func(int a, int b)
{
	cout << 'Two parameters' << endl;
}

int func(int a, int b, int c)
{
	cout << 'Three parameters' << endl;
}

如果 Python 按类似的方式定义函数的话,不会报错,只是后面的函数定义会覆盖前面的,达不到重载的效果。

>>> def func(a):
...   print('One parameter')
... 
>>> def func(a, b):
...   print('Two parameters')
... 
>>> def func(a, b, c):
...   print('Three parameters')
... 
>>> func(1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
>>> func(1, 2)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: func() missing 1 required positional argument: 'c'
>>> func(1, 2, 3)
Three parameters

但是我们知道,Python 函数的形参十分灵活,我们可以只定义一个函数来实现相同的功能,就像这样

>>> def func(*args):
...   if len(args) == 1:
...     print('One parameter')
...   elif len(args) == 2:
...     print('Two parameters')
...   elif len(args) == 3:
...     print('Three parameters')
...   else:
...     print('Error')
... 
>>> func(1)
One parameter
>>> func(1, 2)
Two parameters
>>> func(1, 2, 3)
Three parameters
>>> func(1, 2, 3, 4)
Error

参数类型不同的情形

同样,先看下当前情况下 C++ 的重载是怎么实现的

#include <iostream>
using namespace std;

int func(int a)
{
	cout << 'Int: ' << a << endl;
}

int func(float a)
{
	cout << 'Float: ' << a << endl;
}

代码中,func 支持两种类型的参数:整形和浮点型。调用时,解释器会根据参数类型去寻找合适的函数。Python 要实现类似的功能,需要借助 functools.singledispatch 装饰器。

from functools import singledispatch

@singledispatch
def func(a):
	print(f'Other: {a}')

@func.register(int)
def _(a):
	print(f'Int: {a}')

@func.register(float)
def _(a):
	print(f'Float: {a}')

if __name__ == '__main__':
	func('zzz')
	func(1)
	func(1.2)

func 函数被 functools.singledispatch 装饰后,又根据不同的参数类型绑定了另外两个函数。当参数类型为整形或者浮点型时,调用绑定的对应的某个函数,否则,调用自身。

执行结果

Other: zzz
Int: 1
Float: 1.2

需要注意的是,这种方式只能够根据第一个参数的类型去确定最后调用的函数。

关于 singledispatch 的更多细节请看官方文档

https://docs.python.org/3.6/library/functools.html#functools.singledispatch

注意:函数返回值不同也是重载的一种情况,暂时没有比较好的 Python 实现方式,所以没有提及

个人觉得,重载就是为了语言的灵活性而设计的,而 Python 函数本来就有不少巧妙的设计,这个时候去仿这个技术,其实没有多大必要,而且感觉有些违背 Python 的哲学。所以,本文更多的是在讲如何模仿,而对于重载的使用场景并没有作多少说明。

以上所述是小编给大家介绍的Python函数重载详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python列表append和+的区别浅析
Feb 02 Python
Python中函数参数调用方式分析
Aug 09 Python
对Python 语音识别框架详解
Dec 24 Python
python3实现点餐系统
Jan 24 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
Python计算IV值的示例讲解
Feb 28 Python
新手学python应该下哪个版本
Jun 11 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
Python 没有main函数的原因
Jul 10 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 #Python
Python 存储字符串时节省空间的方法
Apr 23 #Python
Django页面数据的缓存与使用的具体方法
Apr 23 #Python
Python切片操作去除字符串首尾的空格
Apr 22 #Python
详解python中的hashlib模块的使用
Apr 22 #Python
Python 中包/模块的 `import` 操作代码
Apr 22 #Python
python定时检测无响应进程并重启的实例代码
Apr 22 #Python
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
Script的加载方法小结
2011/01/12 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Django更新models数据库结构步骤
2020/04/01 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
新东网科技Java笔试题
2012/07/13 面试题
策划创业计划书
2014/02/06 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
中学生检讨书范文
2014/11/03 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
教师个人师德总结
2015/02/06 职场文书
小学体育组工作总结
2015/08/13 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
MySQL时区造成时差问题
2022/04/13 MySQL