详解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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
进一步探究Python中的正则表达式
Apr 28 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
Python实现的计数排序算法示例
Nov 29 Python
python自动发送邮件脚本
Jun 20 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
python集合能干吗
Jul 19 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Python如何解决secure_filename对中文不支持问题
Jul 16 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
Python类的基础入门知识
2008/11/24 Python
Python中实现常量(Const)功能
2015/01/28 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
简单介绍Python中的round()方法
2015/05/15 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
python实现汽车管理系统
2018/11/30 Python
基于python操作ES实例详解
2019/11/16 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
实习护理工作自我评价
2013/09/25 职场文书
商务日语专业毕业生求职信
2013/10/26 职场文书
自荐信格式技巧有哪些呢
2013/11/19 职场文书
供货协议书范本
2014/04/22 职场文书
2014年统战工作总结
2014/12/09 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL