在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中的socket模块使用代理实例
May 29 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python while 循环使用的简单实例
Jun 08 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python实现的字典值比较功能示例
Jan 08 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
Python解析Excle文件中的数据方法
Oct 23 Python
Python小进度条显示代码
Mar 05 Python
六行python代码的爱心曲线详解
May 17 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
python爬虫分布式获取数据的实例方法
Nov 26 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服务器实现多session并发运行
2006/10/09 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
php中fsockopen用法实例
2015/01/05 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python实现类之间的方法互相调用
2018/04/29 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
如何用python写个模板引擎
2021/01/14 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
中学生学雷锋演讲稿
2014/04/26 职场文书
品牌转让协议书
2014/08/20 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
合理化建议书
2015/02/04 职场文书
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS
Python实现照片卡通化
2021/12/06 Python
Hive常用日期格式转换语法
2022/06/25 数据库