原来 Python 也有重载?

2023-11-08

Python作为一门动态语言,其实并不需要重载,但是如果你愿意的话,可以显式的声明重载。

先简单介绍下什么是重载(Overload)。

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

提出问题

简单的举个例子。

现在有一个get函数,接收参数v,v的类型为整数,最终get的返回值也是整数类型。

def get(v: int) -> int:
	return v + 1

现在又有一个同名的get函数,接收参数v,v的类型为字符串,最终get的返回值也是字符串类型。

def get(v: str) -> str:
	return v + "1"

啊这? 难道这两个函数不能合并成一个吗,对,是可以的,如下:

def get(v: Union[int, str]) -> Union[int, str]:
	if isinstance(v, int):
		return v + 1
	elif isinstance(v, str):
		return v + "1"

对于编辑器而言,get的参数v可能是int,也可能是str,同理返回值可能是int也可能是str。这里就出现歧义,现在我作为get的调用者,我现在传递一个int类型的参数,那get的返回值是int呢,还是str呢?

可以看到,无论我传入的参数是int还是str,返回值全都是Union[int, str]

作为方法的开发者,我们固然可以在get函数的注释中,描述其函数的功能,例如:

参数v接收intstr类型的数据,传入int则返回值是int类型,传入str则返回值是str类型。

当然,作为调用者也可以在拿到get的返回值后,使用isinstance进行类型的判断。

这里,我想介绍的方法是重载装饰器,@overload

重载装饰器

https://docs.python.org/zh-cn/3/library/typing.html?highlight=typing#typing.overload

overload是标准库typing中的一个装饰器,使用方法很简单。

from typing import overload

@overload
def get(v: int) -> int:
	...

@overload
def get(v: str) -> str:
	...

def get(v):
	if isinstance(v, int):
		return v + 1
	elif isinstance(v, str):
		return v + "1"

可以看到,编辑器会根据我们传入的值,提示我们函数返回值的类型。

现在你可能会认为,功能是实现了,但是也增加了很多无用的代码。

这个确实,所以如果你想以这样的方式进行更加具体的类型标注,我建议你将类型标注的代码写入存根文件中。

存根文件指的是,后缀为pyi结尾的文件,它的目的就是用于类型标注的。

所以我们可以优化上方代码。

a.py 代码的功能主体

def get(v): 
	if isinstance(v, int):
		return v + 1
	elif isinstance(v, str):
		return v + "1"
	else:
		raise TypeError
    return v

定义同名存根文件
a.pyi

from typing import overload  
  
  
@overload  
def get(v: int) -> int:  
    ...  
  
  
@overload  
def get(v: str) -> str:  
    ...

这样就可以将类型注解与功能进行分开了。

其实我们使用Python,看重的就是它的灵活性,而我强制的加上了类型注解,让它变得不那么“动态”了。在写代码时加上类型注解,确实会影响我们的开发效率,代码也不再那么Python,但是这也确确实实帮助到了我们代码的调用者,让调用者提升了效率。

如果你想开发一个自己的Python第三方库,我真心的建议你加上类型注解,无论是为了代码的调用者,还是为了日后的维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原来 Python 也有重载? 的相关文章

随机推荐

  • QT之滑动切换UI框架

    简介 使用QT制作一个UI图片切换框架 思路 主要通过移动像素坐标差值来判断方向 左上角坐标为 0 0 右加左减 松开减去按压时的横坐标大于0则右移 否则左移 代码展示 define X Threshold Direction 4 X方向移
  • 惠普m132nw清零方法_惠普HP打印机墨盒清零方法

    hp816 hp817是惠普多款打印机产品的标配墨盒 由于适应机型多 这两款墨盒是目前非常畅销的 对于很多用户来说 使用原装墨盒未必是最佳能选择 对使用完毕的墨盒进行加墨是很通常的选择 但注墨之后墨盒计数器的清零非常关键 在此 就为各位传授
  • GO语言实现二叉树基本功能

    用GO语言和用C语言写的思路没有区别 都是利用递归来解决遍历难的问题 这里值得注意的是 在GO中用switch case是完全可以代替if else的 个人觉得在做多项判断时用switch case来写不仅效率更高 思路也更清晰 也使得代码
  • 【目录】从0到1玩转分布式锁底层原理

    一 课程目录 分布式锁是什么 为什么需要分布式锁 如何用MySQL实现一把分布式锁 Redis实现分布式锁的核心原理以及利弊 分布式锁核心类库Redisson初识 Redisson加锁的核心底层源码 Redisson锁是如何做到可重入和互斥
  • 离散行业和流程行业的区别

    所谓离散型生产企业主要是指一大类机械加工企业 它们的基本生产特征是机器 机床 对工件外形的加工 再将不同的工件组装成具有某种功能的产品 由于机器和工件都是分立的 故称之为离散型生产方式 离散行业是指制造企业中的一类企业 他们的最主要特征为
  • 八、C语言进阶:内存

    8 内存 8 1 内存四区 8 1 1 栈区 stack 由编译器自动分配和释放 主要是存放函数参数的值 局部变量的值 8 1 2 堆区 heap 由程序员自己申请分配和释放 需要malloc calloc realloc 函数来申请 用f
  • 【pygame】Rect对象

    Rect对象 class pygame Rect Rect 是用于存储矩形坐标的 Pygame 对象 Rect left top width height gt Rect Rect left top width height gt Rect
  • linux查看服务器内存占用情况

    查看某个进程的占用内存情况 以 device maintenance 为例 1 查找进程号 ps ef grep device maintenance 或 ps aux grep device maintenance 2 查看服务器整体内存
  • opencv设置摄像头分辨率不生效

    opencv vs2019 videoCapture set分辨率1600 1200 设置为1600 1200 读取时变成了1280 960 在linux上是正常的 到了win10不知怎得就设置不了了 解决方法 cv VideoCaptur
  • Qt的CMake添加外部dll

    设置外部库路径 set OPENCV LIB DIR D Windows Kits opencv build x64 vc16 lib set OPENCV DLL DIR D Windows Kits opencv build x64 v
  • 主机宝服务器默认页修改,您访问的是主机宝服务器默认页

    您访问的是主机宝服务器默认页 内容精选 换一换 私网NAT网关创建后 通过添加DNAT规则 则可以通过映射方式将您VPC内的云主机实例对外部私网 IDC或其他VPC 提供服务 云主机的每个端口分别对应一条DNAT规则 一个云主机的多个端口或
  • Golf Range Finder 高尔夫激光测距仪和GPS测距仪

    打球时 如果知道准确的距离 就可以根据自己的情况选择合适的球杆 这对成绩的好坏很重要 职业高尔夫的球童除了背包 最重要的一项职能就是判断距离 帮助球员选择球杆 业余选手没有那么奢华 有专业的球童 这样就成就了测距仪市场 目前市场上的测距仪有
  • mysql use temporary_一次mysql 优化 (Using temporary ; Using filesort)

    遇到一个SQL执行很慢 SQL 如下 SELECT FROM tableA WHERE time gt 1492044535 and time lt 1492046335 GROUP by time sourceName serverSit
  • 机器学习 -- 决策树(Ⅴ决策树构造实例)

    决策树构造实例 有如下表格的数据 是近两周 14天 的打球情况 特征为天气表现 温度 适度 是否有风4种不同的环境 目标 构造决策树 问题 拿哪个特征作为根节点 有4种划分方式如下 判断依据 信息增益 1 求熵 在14天的数据中 有9天有打
  • 安装 kubeadm

    安装 kubeadm kubelet 和 kubectl 基于Red Hat的发行版本 1 写入软件源 cat lt
  • python中rfind的用法_在Python中实现rfind

    因此 在ch中 您有字符 而不是字符的索引 所以即使您找到它 也无法知道它的索引 您只知道该字符在您的text字符串中 无其他内容 而且 当你发现一个巧合时 你会打印 无 在print 中 而且由于return 1 如果没有找到 在for循
  • Jenkins 基本使用

    在jenkins的项目中上配置通过ssh发布jar包到远程服务器 克隆 编译 测试 打包 下载 jenkins war 下载地址 https blog csdn net m0 46370483 article details 1215082
  • Linux文件查找和打包压缩

    成功不易 加倍努力 八 文件查找和打包压缩 1 文件查找 1 1 locate 1 2 nd 1 3 参数替换 xargs 2 压缩和解压缩 2 1 compress和uncompress 2 2 gzip和gunzip 2 3 bzip2
  • eclipse中为项目添加外部依赖jar包

    eclipse中为项目添加外部依赖jar包 1 右击项目名 选择build path gt configure build path gt 然后点击 2 之后点击 Add Externl JARS 选择下载好的jar包 点击打开 3 点击A
  • 原来 Python 也有重载?

    Python作为一门动态语言 其实并不需要重载 但是如果你愿意的话 可以显式的声明重载 先简单介绍下什么是重载 Overload 重载 overloading 是在一个类里面 方法名字相同 而参数不同 返回类型可以相同也可以不同 提出问题