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)

复制代码

我们运行一下这段代码,大家看看根据参数的不同,有什么样的不同效果:

可以看到,我们调用的函数,始终都是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就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

python 函数重载_在Python中实现函数重载,60%的人都不会相关推荐

  1. python imshow参数_用matplotlib中imshow()函数绘图

    matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...

  2. mysql视图中调用函数写法_从视图中调用函数

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  4. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  5. matlab roundn函数_columns函数的使用方法 matlab中round函数具体用法

    Excel中column函数的使用方法是什么?其实小编会说分手是想被挽留,你却顺口祝小编自由. 只读属性,返回 TextStream 文件中当前字符位置的列号. 语法: =Column(referen ...

  6. java方法重载_在Python中该如何实现Java的重写与重载

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...

  7. python configure函数 循环_使用python统计git仓库中频繁修改的热点函数

    本篇博客以开源代码RT-Thread为例,描述了如何使用python扫描统计代码中频繁修改的函数,帮助我们发现系统中需求变化和BUG制造的重灾区. 需求背景 最近在学习设计模式时,印象深刻的一句话就是 ...

  8. python打印时间_在Python中定义Main函数(第二部分)

    Main函数的最佳实践 既然您已经了解两种执行方式上的差异,那么掌握一些最佳实践方案还是很有用的.它们将适用于编写作为脚本运行的代码或者在另一个模块导入的代码. 如下是四种实践方式: 将大部分代码放入 ...

  9. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

最新文章

  1. CISCO路由器、交换机密码破解
  2. MySQL查看表结构的实际操作命令简介
  3. [转载]C/C++框架和库
  4. java中week of year_Java WeekFields weekOfYear()用法及代码示例
  5. 【项目合作】低清老视频转高清,视频超分辨
  6. 剑指Offer(Java版):把字符串转换成整数
  7. javascript 验证身份证
  8. C和指针---读书笔记16
  9. 陈后金信号与系统matlab习题答案,陈后金信号与系统第2版课后习题答案解析
  10. STM32驱动AD9833
  11. php实现给pdf加水印,pdf文件如何加水印 怎样给pdf文件加水印|帮你轻松实现给pdf加水印...
  12. java生产者消费者模型
  13. 获取远程资源提示msxml3.dll指定资源下载失败
  14. Leetcode No.198 打家劫舍(动态规划)
  15. 抖音小店无货源,营业执照怎么办理?该怎么选择经营范围?
  16. 迭代器 iter()
  17. 如何获取客户端真实IP
  18. funcode 音乐播放、提示及提示消失、时间显示等(c++版)
  19. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第三讲mysql8.0安装配置升级(上)
  20. 18.4宽屏的笔记本——Acer Aspire 8920G-933G32Bn

热门文章

  1. 用 Gearman 分发 PHP 应用程序的工作负载
  2. cmake学习(五) 系统默认变量和内置变量
  3. 显卡欺骗器状态检测及安装注意事项
  4. 解决scala_spark本地读取csv中文乱码问题
  5. JAVA程序设计----多线程(下)
  6. Purpose of cmove instruction in x86 assembly? | cmove 指令如何避免错误的分支预测带来的开销?
  7. 【牛客网】迷途的牛牛 C++
  8. 分布式表格系统Google Bigtable详解
  9. Leet Code OJ 107. Binary Tree Level Order Traversal II [Difficulty: Easy]
  10. 台虚拟机更改计算机名,检查虚拟机的硬件信息、更改虚拟机名称、查看虚拟机配...