在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集合类型用法分析
Apr 08 Python
python中enumerate函数用法实例分析
May 20 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
用Python写一个无界面的2048小游戏
May 24 Python
python中map的基本用法示例
Sep 10 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
浅谈pycharm使用及设置方法
Sep 09 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
jupyter note 实现将数据保存为word
Apr 14 Python
python 如何在list中找Topk的数值和索引
May 20 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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
offsetParent 算法分析
2010/04/05 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[00:11]战神迅矛
2019/03/06 DOTA
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
ASP.NET Core中的配置详解
2021/02/05 Python
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
师范生自荐信
2013/10/27 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
母亲节演讲稿
2014/05/27 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
董事长助理岗位职责
2015/02/11 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书