在Python中实现函数重载的示例代码


Posted in Python onDecember 12, 2019

假设你有一个函数connect,它有一个参数address,这个参数可能是一个字符串,也可能是一个元组。例如:

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))

你想在代码里面兼容这两种写法,于是你可能会这样写代码:

def connect(address):
 if isinstance(address, str):
 ip, port = address.split(':')
 elif isinstance(address, tuple):
 ip, port = address
 else:
 print('地址格式不正确')

这种写法简单直接,但是如果参数的类型更多,那么你就需要写很长的 if-elif-elif-...-else 。代码看起来就非常不美观。

学习过 Java 的同学,应该对函数重载比较熟悉,可以定义几个名字相同的函数,但是他们的参数类型或者数量不同,从而实现不同的代码逻辑。

在 Python 里面,参数的数量不同可以使用默认参数来解决,不需要定义多个函数。那如果参数类型不同就实现不同的逻辑,除了上面的 if-else 外,我们还可以使用 functools 模块里面的 singledispatch 装饰器实现函数重载。

我们来写一段代码:

from functools import singledispatch

@singledispatch
def connect(address):
 print(f' 传输参数类型为:{type(address)},不是有效类型')

@connect.register
def _(address: str):
 ip, port = address.split(':')
 print(f'参数为字符串,IP是:{ip}, 端口是:{port}')

@connect.register
def _(address: tuple):
 ip, port = address
 print(f'参数为元组,IP是:{ip}, 端口是:{port}')

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))
connect(123)

我们运行一下这段代码,大家看看根据参数的不同,有什么样的不同效果:

在Python中实现函数重载的示例代码

可以看到,我们调用的函数,始终都是 connect ,但是由于传入参数的类型不同,它运行的结果也不一样。

我们使用 singledispatch 装饰一个函数,那么这个函数就是我们将会调用的函数。

这个函数在传入参数不同时的具体实现,通过下面注册的函数来实现。注册的时候使用 @我们定义的函数名.register 来注册。被注册的函数名叫什么无关紧要,所以这里我都直接使用下划线代替。

被注册的函数的第一个参数,通过类型标注来确定它应该使用什么类型。当我们调用我们定义的函数是,如果参数类型符合某个被注册的函数,那么就会执行这个被注册的函数。如果参数类型不满足任何一个被注册的函数,那么就会执行我们的原函数。

使用类型标注来指定参数类型是从 Python 3.7才引入的新特性。在 Python 3.6或之前的版本,我们需要通过 @我们定义的函数名.register(类型) 来指定类型,例如:

from functools import singledispatch

@singledispatch
def connect(address):
 print(f' 传输参数类型为:{type(address)},不是有效类型')

@connect.register(str)
def _(address):
 ip, port = address.split(':')
 print(f'参数为字符串,IP是:{ip}, 端口是:{port}')

@connect.register(tuple)
def _(address):
 ip, port = address
 print(f'参数为元组,IP是:{ip}, 端口是:{port}')

同时,还有一个需要注意的点,就是只有第一个参数的不同类型会被重载。后面的参数的类型变化会被自动忽略。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用SAE部署Python运行环境的教程
May 05 Python
python实现数独算法实例
Jun 09 Python
利用Python破解斗地主残局详解
Jun 30 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Python GUI编程完整示例
Apr 04 Python
简单了解django缓存方式及配置
Jul 19 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
python基础 range的用法解析
Aug 23 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
python b站视频下载的五种版本
May 27 Python
django框架F&Q 聚合与分组操作示例
Dec 12 #Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 #Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 #Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 #Python
python 使用opencv 把视频分割成图片示例
Dec 12 #Python
Python2与Python3的区别点整理
Dec 12 #Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 #Python
You might like
php cout<<的一点看法
2010/01/24 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
php常用数组函数实例小结
2016/12/29 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
javascript实现拖放效果
2015/12/16 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python内置的字符串处理函数整理
2013/01/29 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
对numpy中轴与维度的理解
2018/04/18 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
python使用建议技巧分享(三)
2020/08/18 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
北京天坛导游词
2015/02/12 职场文书
慰问信格式规范
2015/03/23 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server