详解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 相关文章推荐
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
Python实现的凯撒密码算法示例
Apr 12 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
基于python实现KNN分类算法
Apr 23 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
如何在python中执行另一个py文件
Apr 30 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
在python中对于bool布尔值的取反操作
Dec 11 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
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
HTML DOM的nodeType值介绍
2011/03/31 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
javascript中indexOf技术详解
2015/05/07 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
Python使用turtule画五角星的方法
2015/07/09 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
2014年五四青年节活动方案
2014/03/29 职场文书
和解协议书
2014/04/16 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
2014年教师工作总结
2014/11/10 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
2016情人节宣传语
2015/07/14 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android