详解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简单实现TCP包发送十六进制数据的方法
Apr 16 Python
Python OpenCV获取视频的方法
Feb 28 Python
python 列表删除所有指定元素的方法
Apr 19 Python
Python代码缩进和测试模块示例详解
May 07 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
python中几种自动微分库解析
Aug 29 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
Python类反射机制使用实例解析
Dec 30 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 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
php中的常用魔术方法总结
2013/08/02 PHP
php中的异常和错误浅析
2017/05/03 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
详解微信UnionID作用
2019/05/15 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
python控制台中实现进度条功能
2015/11/10 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python中base64与xml取值结合问题
2019/12/22 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
师范生实习的个人自我鉴定
2013/10/20 职场文书
求职自荐信范文格式
2013/11/29 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
火锅店营销方案
2014/02/26 职场文书
奉献演讲稿范文
2014/05/21 职场文书
求职简历自荐信
2014/06/18 职场文书
公司员工奖惩制度
2015/08/04 职场文书
oracle索引总结
2021/09/25 Oracle