在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的Template使用指南
Sep 11 Python
python里大整数相乘相关技巧指南
Sep 12 Python
进一步理解Python中的函数编程
Apr 13 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
Flask数据库迁移简单介绍
Oct 24 Python
Python程序运行原理图文解析
Feb 10 Python
Python KMeans聚类问题分析
Feb 23 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
详解python变量与数据类型
Aug 25 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python实现约瑟夫环问题的方法
2016/05/03 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
tensorflow更改变量的值实例
2018/07/30 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
如何用python批量调整视频声音
2020/12/22 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
医院总经理职责
2013/12/26 职场文书
安全宣传标语
2014/06/10 职场文书
论文答谢词
2015/01/20 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
简历自我评价范文
2019/04/24 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
spring boot中nativeQuery的用法
2021/07/26 Java/Android
Python中的datetime包与time包包和模块详情
2022/02/28 Python