详解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字符串处理实现单词反转
Jun 14 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
Python实现网站表单提交和模板
Jan 15 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
如何使用python进行pdf文件分割
Nov 11 Python
python 实现二维列表转置
Dec 02 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
详解Python 3.10 中的新功能和变化
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
模仿OSO的论坛(四)
2006/10/09 PHP
用PHP实现图象锐化代码
2007/06/14 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
PHP 数组教程 定义数组
2009/10/23 PHP
试用php中oci8扩展
2015/06/18 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
原生js实现表格循环滚动
2020/11/24 Javascript
Python自动连接ssh的方法
2015/03/07 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
一文读懂Python 枚举
2020/08/25 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
.NET面试10题
2014/02/24 面试题
放飞蜻蜓反思
2014/02/05 职场文书
销售岗位职责范本
2014/06/12 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
护士节慰问信
2015/02/15 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Java集成swagger文档组件
2021/06/28 Java/Android
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL