详解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脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
python提示No module named images的解决方法
Sep 29 Python
qpython3 读取安卓lastpass Cookies
Jun 19 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
python命名空间(namespace)简单介绍
Aug 10 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
python的sys.path模块路径添加方式
Mar 09 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Django之全局使用request.user.username的实例详解
May 14 Python
python list的index()和find()的实现
Nov 16 Python
python基于pygame实现飞机大作战小游戏
Nov 19 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之将POST数据转化为字符串的实现代码
2016/11/03 PHP
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
layui实现文件或图片上传记录
2018/08/28 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
python提取内容关键词的方法
2015/03/16 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
店长助理岗位职责
2013/12/13 职场文书
学生打架检讨书大全
2014/01/23 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
农业开发项目建议书
2014/05/16 职场文书
借款协议书
2014/09/16 职场文书
大二学生自我检讨书
2014/10/23 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
企业承诺书格式范文
2015/04/28 职场文书
教师节班会开场白
2015/06/01 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
Github 使用python对copilot做些简单使用测试
2022/04/14 Python