详解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读取excel表格生成erlang数据
Aug 26 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
python把转列表为集合的方法
Jun 28 Python
Django中的用户身份验证示例详解
Aug 07 Python
详解如何减少python内存的消耗
Aug 09 Python
Python常用数据类型之间的转换总结
Sep 06 Python
python加载自定义词典实例
Dec 06 Python
Django在Model保存前记录日志实例
May 14 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 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
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
Python多线程正确用法实例解析
2020/05/30 Python
python exit出错原因整理
2020/08/31 Python
Python jieba库分词模式实例用法
2021/01/13 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
党章学习思想汇报
2014/01/14 职场文书
高二化学教学反思
2014/01/30 职场文书
双创工作实施方案
2014/03/26 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
禁毒宣传标语
2014/06/19 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
公司宣传语大全
2015/07/13 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书