在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实现文件按照日期命名的方法
Jul 09 Python
python基础教程项目四之新闻聚合
Apr 02 Python
Python延时操作实现方法示例
Aug 14 Python
Python多线程原理与用法实例剖析
Jan 22 Python
python 模拟银行转账功能过程详解
Aug 06 Python
python文件处理fileinput使用方法详解
Jan 02 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
python实现从ftp服务器下载文件
Mar 03 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 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
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
script标签属性用type还是language
2015/01/21 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
Vue.js用法详解
2017/11/13 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
Python MD5文件生成码
2009/01/12 Python
python将字符串转换成数组的方法
2015/04/29 Python
Python实现端口检测的方法
2018/07/24 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
会计自我鉴定范文
2013/10/06 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
介绍长城的导游词
2015/01/30 职场文书
教师节班会开场白
2015/06/01 职场文书
实施意见格式范本
2015/06/05 职场文书
小学数学教师研修感悟
2015/11/18 职场文书