在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中精确输出JSON浮点数的方法
Apr 18 Python
Python描述器descriptor详解
Feb 03 Python
安装dbus-python的简要教程
May 05 Python
python文本数据相似度的度量
Mar 12 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python3标准库总结
Feb 19 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
python做接口测试的必要性
Nov 20 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
python 实现两个npy档案合并
Jul 01 Python
Python基础教程之输入输出和运算符
Jul 26 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系统命令函数使用分析
2013/07/05 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
AngularJS基础知识
2014/12/21 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
node跨域请求方法小结
2017/08/25 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
numpy.random模块用法总结
2019/05/27 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python多线程分块读取文件
2019/08/29 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
公司营业员的工作总结自我评价
2013/10/05 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
校园之声广播稿
2014/01/31 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
python pyhs2 的安装操作
2021/04/07 Python
微信小程序实现聊天室功能
2021/06/14 Javascript