在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 相关文章推荐
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
Python脚本实现网卡流量监控
Feb 14 Python
Python如何实现守护进程的方法示例
Feb 08 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
微信公众号token验证失败解决方案
Jul 22 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
如何写python的配置文件
Jun 07 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Pytorch DataLoader shuffle验证方式
Jun 02 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中读取文件的8种方法和代码实例
2014/08/05 PHP
初识php MVC
2014/09/10 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
python flask中动态URL规则详解
2019/11/22 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
建筑工程造价专业自荐信
2014/07/08 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript