在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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python函数的5种参数详解
Feb 24 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Redis使用watch完成秒杀抢购功能的代码
May 07 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
Django中的用户身份验证示例详解
Aug 07 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 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
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
深入浅析javascript继承体系
2017/10/23 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
python绘图库Matplotlib的安装
2014/07/03 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
python中map()函数的使用方法示例
2017/09/29 Python
Python反射用法实例简析
2017/12/22 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python保存网页图片到本地的方法
2018/07/24 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
python多任务及返回值的处理方法
2019/01/22 Python
python中如何写类
2020/06/29 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
建房协议书
2014/04/11 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2014年服务员工作总结
2014/11/18 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
python实现商品进销存管理系统
2022/05/30 Python