详解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异常处理慎用“except:pass”建议
Apr 02 Python
进一步理解Python中的函数编程
Apr 13 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python 通过pip安装Django详细介绍
Apr 28 Python
使用Turtle画正螺旋线的方法
Sep 22 Python
PyQt实现界面翻转切换效果
Apr 20 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
详解Python实现进度条的4种方式
Jan 15 Python
python实现引用其他路径包里面的模块
Mar 09 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
python中使用np.delete()的实例方法
Feb 01 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
应聘教师自荐信
2013/10/12 职场文书
给老师的检讨书
2014/02/11 职场文书
销售队伍口号
2014/06/11 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
介绍长城的导游词
2015/01/30 职场文书
实习介绍信范文
2015/05/05 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
七年级语文教学反思
2016/03/03 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
Redis批量生成数据的实现
2022/06/05 Redis