在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 03 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
python实现按长宽比缩放图片
Jun 07 Python
python 字符串和整数的转换方法
Jun 25 Python
Python 字符串换行的多种方式
Sep 06 Python
python实现代码统计程序
Sep 19 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
基于Pytorch SSD模型分析
Feb 18 Python
python openpyxl模块的使用详解
Feb 25 Python
Python pandas之求和运算和非空值个数统计
Aug 07 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实现用户认证及管理完全源码
2007/03/11 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
python如何建立全零数组
2020/07/19 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
党校培训自我鉴定
2014/02/01 职场文书
大学生职业规划书的范本
2014/02/18 职场文书
机电一体化专业求职信
2014/07/22 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2014年环卫工作总结
2014/11/22 职场文书
婚内分居协议书范文
2014/11/26 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
Python基础之Socket通信原理
2021/04/22 Python
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
Python数据分析之pandas读取数据
2021/06/02 Python