在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中的Classes和Metaclasses详解
Apr 02 Python
python3抓取中文网页的方法
Jul 28 Python
python一键升级所有pip package的方法
Jan 16 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
Python生成器next方法和send方法区别详解
May 30 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
python打开音乐文件的实例方法
Jul 21 Python
Python 列表反转显示的四种方法
Nov 16 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
3
2006/10/09 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
详解python的四种内置数据结构
2019/03/19 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
出纳的岗位职责
2013/11/09 职场文书
房地产销售计划书
2014/01/10 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
运动会表扬稿
2015/01/16 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL
基于Python实现一个春节倒计时脚本
2022/01/22 Python