详解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中关于中文编码问题的处理建议
Apr 08 Python
python字符串,数值计算
Oct 05 Python
高效使用Python字典的清单
Apr 04 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
Python requests模块实例用法
Feb 11 Python
Django框架实现分页显示内容的方法详解
May 10 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
Python如何在DataFrame增加数值
Feb 14 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
python自动下载图片的方法示例
Mar 25 Python
Python基础详解之邮件处理
Apr 28 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
newxtree.js代码
2007/03/13 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python和C语言混合编程实例
2014/06/04 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python实现各种插值法(数值分析)
2019/07/30 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
python初步实现word2vec操作
2020/06/09 Python
python如何从键盘获取输入实例
2020/06/18 Python
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
酒店管理自荐信
2013/10/23 职场文书
工作会议欢迎词
2014/01/16 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
小学校长个人总结
2015/03/03 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
高中开学感言
2015/08/01 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android