告别复杂判断!Python中实现函数重载的终极技巧
引言
说到函数重载,学过 Java 的同学应该不陌生,最常用的地方应该就是打印 log 了,对于不同的参数,调用的是不同的重载函数。那么 Python 如何实现函数重载呢?
重载概念
函数重载是指在同一作用域内,允许多个同名函数存在,但它们的参数列表不同。虽然许多编程语言(如 Java 和 C++)支持函数重载,但 Python 的设计哲学使其不能直接支持这一特性。
不使用重载
先看一个例子,在不使用重载的情况下,实现一个 log 函数:
from attr import dataclass@dataclass
class MyException(Exception):msg: strdef log(message):if isinstance(message, MyException):print(message.msg)elif isinstance(message, str):print(message)else:print(f'invalid message:{message}')log(MyException('my exception'))
log('str exception')
log(1111)# 运行结果为:
# my exception
# str exception
# invalid message:1111
不使用重载的话,就要写很多判断的代码,来判断入参的类型。
使用重载
from functools import singledispatchfrom attr import dataclass@dataclass
class MyException(Exception):msg: str@singledispatch
def log(message):print(f'invalid message:{message}')@log.register
def _(message: MyException):print(message.msg)@log.register
def _(message: str):print(message)log(MyException('my exception'))
log('str exception')
log(1111)# 运行结果为:
# my exception
# str exception
# invalid message:1111
通过以上代码可以看到,使用重载的情况下,代码简洁了很多,将之前的 if-else 判断都去掉了,每个重载函数根据对应的类型直接输出对应的日志,说明在调用函数时,会自动判断函数的参数类型,然后调用对应的重载函数来执行对应的逻辑。
如果有新增类型的需求,只需要在原有的基础上增加一个重载函数即可,大大简化了新增类型的难度。例如:
from functools import singledispatchfrom attr import dataclass@dataclass
class MyException(Exception):msg: str@singledispatch
def log(message):print(f'invalid message:{message}')@log.register
def _(message: MyException):print(message.msg)@log.register
def _(message: str):print(message)@log.register
def _(message: int):print(f'int message:{message}')log(MyException('my exception'))
log('str exception')
log(1111)# 运行结果为:
# my exception
# str exception
# int message:1111
重载写法
通过以上的代码,总结 Python 通过 functools.singledispatch 进行重载的写法。
- 首先定义一个函数,加上
@singledispatch装饰器 - 然后添加几个以下划线为函数名的函数,因为重载函数的名字都一样,没有必要起其他的名字,用下划线代替即可。
- 为下划线函数设置对应的函数参数类型,编写函数内容。
- 调用函数来测试是否生效。
数据类
可能会有小伙伴问,自定义异常上有一个 @dataclass 装饰器,这个是干嘛用的,为什么没有写 __init__() 函数。
这个装饰器是Python3.6 中新引入的一个概念,熟悉 Java 的小伙伴可能会知道,它有点类似于 Java 中的 lombok 中的 @data 注解。它的作用是自动为用户自定义的类添加生成的特殊方法,例如 __init__() 和 __repr__()。
from dataclasses import dataclass@dataclass
class InventoryItem:"""Class for keeping track of an item in inventory."""name: strunit_price: floatquantity_on_hand: int = 0def total_cost(self) -> float:return self.unit_price * self.quantity_on_hand
上面的类不需要单独再写下面的函数,@dataclass 装饰器会自动生成。
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):self.name = nameself.unit_price = unit_priceself.quantity_on_hand = quantity_on_hand
所以 @dataclass 可以帮助我们简化代码,提升开发效率,具体的用法可以参考官方文档。
总结
在 Python 中,虽然不支持传统的函数重载,但我们可以通过 functools.singledispatch 方法来实现类似的功能。同时,需要注意一下,只有第一个参数的不同类型会被重载,后面参数的类型变化会被忽略。
相关文章:
告别复杂判断!Python中实现函数重载的终极技巧
引言 说到函数重载,学过 Java 的同学应该不陌生,最常用的地方应该就是打印 log 了,对于不同的参数,调用的是不同的重载函数。那么 Python 如何实现函数重载呢? 重载概念 函数重载是指在同一作用域内,允许…...
Clang-Format:让你的代码整齐划一,格式不再烦恼
在现代软件开发中,代码规范和一致性对团队协作和代码质量至关重要。如何保持代码风格一致,避免手动格式化的繁琐操作?clang-format 是一款强大而灵活的代码格式化工具,它为开发者提供了高效的解决方案。本文将详细介绍 clang-form…...
【jvm】Full GC
目录 1. 说明2. 触发条件3. 优化4. 注意事项 1. 说明 1.Full GC(Full Garbage Collection)是Java垃圾回收过程中最重要且最昂贵的一种操作。2.Full GC涉及对整个堆内存(包括年轻代和老年代)的垃圾回收。3.当Full GC发生时&#x…...
【Python】实战:请使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
# 定义汽车基类 class Car:def __init__(self, model, license_plate):self.model model # 车型self.license_plate license_plate # 车牌def start(self):print(f"{self.model} ({self.license_plate}) 启动了。")def stop(self):print(f"{self.model} ({s…...
互联网摸鱼日报(2024-11-07)
互联网摸鱼日报(2024-11-07) 36氪新闻 阿华田再现颓势 中国旅游景区上市公司,三季度财报好看吗? 电动化浪潮下,消费者彻底放弃百年品牌BBA? 估值114亿,海尔系独角兽终止IPO 又一知名品牌门店全关,高端…...
requests库
GET请求 基本实例import requestsresponse requests.get(https://www.httpbin.org/get) print(response.text)params参数import requests data {"name":"Bileton","age":"21" } response requests.get(https://www.httpbin.org/ge…...
大数据之多级缓存方案
多级缓存介绍?多级缓存优缺点,应用场景?多级缓存架构? 多级缓存介绍 多级缓存方案是一种优化手段,通过在多个级别上存储数据来提高应用程序的性能和响应速度。以下是对多级缓存方案的详细解析: 一、多级缓…...
QCon演讲实录|徐广治:边缘云原生操作系统的设计与思考
10月18日,在 QCon 全球软件开发大会 2024(上海站),火山引擎边缘云资深架构师徐广治围绕火山引擎边缘计算产品背后的算力底座 - 边缘云原生操作系统,探讨如何实现算力服务的混合部署和跨区域弹性调度,以及在…...
web第二次作业
代码如下 <!DOCTYPE html> <html> <head> <!-- 设置页面的字符编码为utf-8,确保能正确显示各种字符 --> <meta charset"utf-8"> <title></title> <style> /* 全局样式设置 */ *{ …...
大模型技术讲解:大模型参数微调(大模型微调)
转自 秋色稻田公众号 这篇文章讲讲大模型的参数微调,参数微调(Fine-tuning)是一种机器学习技术,用于调整大型预训练模型的参数,以大模型适应特定应用场景。这种方法通常用于自然语言处理(NLP)…...
测试自动化如何和业务流程结合?
测试自动化框架固然重要,但是最终自动化的目的都是为了业务服务的。 那测试自动化如何对业务流程产生积极影响? 业务流程的重要性 测试自动化项目并非孤立存在,其生命周期与被测试的应用程序紧密相关。项目的价值在于被整个开发团队所使用&a…...
Python进阶之IO操作
文章目录 一、文件的读取二、文件内容的写入三、之操作文件夹四、StringIO与BytesIO 一、文件的读取 在python里面,可以使用open函数来打开文件,具体语法如下: open(filename, mode)filename:文件名,一般包括该文件所…...
ubuntu如何卸载colmap
如果你是通过源码编译并安装的 COLMAP,可以按照以下步骤手动卸载: 1. **查找安装路径**: 检查 COLMAP 安装时的路径(通常是 /usr/local)。 2. **删除二进制文件**: 删除已安装的 COLMAP 可执行文…...
【comfyui教程】ComfyUI即将迎来全新界面:升级体验就在11月15日
前言 ComfyUI迎来全新界面:升级体验就在11月15日 想象一下,拥有一个更直观、更智能的用户界面,不再需要在繁杂的设置中摸索。这不再只是梦想!从2024年11月15日起,ComfyUI将正式启用新UI (Beta UI)作为默认界面&#…...
Leecode热题100-104.二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…...
深度学习中的 Dropout:原理、公式与实现解析
8. dropout 深度学习中的 Dropout:原理、公式与实现解析 在神经网络训练中,模型往往倾向于“记住”训练数据的细节甚至噪声,导致模型在新数据上的表现不佳,即过拟合。为了解决这一问题,Dropout 应运而生。通过在训练…...
【大数据学习 | HBASE】habse的表结构
在使用的时候hbase就是一个普通的表,但是hbase是一个列式存储的表结构,与我们常用的mysql等关系型数据库的存储方式不同,mysql中的所有列的数据是按照行级别进行存储的,查询数据要整个一行查询出来,不想要的字段也需要…...
完成程序《大奖赛评分B》
学习目标: 使用代码完成程序《大奖赛评分B》 题目: 如今许多歌手大奖赛评分时,为了体现公平,在评委给出分数后统计平均得分时,都会去掉最高分和最低分。编写程序,读入评委打分(分数都是大于0的…...
K8S篇(基本介绍)
目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…...
linux alsa-lib snd_pcm_open函数源码分析(三)
欢迎直接到博客 linux alsa-lib snd_pcm_open函数源码分析(三) 系列文章其他部分: linux alsa-lib snd_pcm_open函数源码分析(一) linux alsa-lib snd_pcm_open函数源码分析(二) linux alsa-lib snd_pcm_open函数源码分析(四…...
ncmdumpGUI:免费解锁网易云音乐加密文件,3分钟实现跨设备播放自由
ncmdumpGUI:免费解锁网易云音乐加密文件,3分钟实现跨设备播放自由 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样…...
别再手动复制文件了!Mathtype 7.4 一键配置脚本,搞定Office和WPS(附常见错误修复)
数学公式编辑神器Mathtype 7.4全自动部署方案:告别手动配置的繁琐时代 在科研论文、技术文档撰写过程中,数学公式的编辑效率直接影响工作进度。Mathtype作为专业数学公式编辑工具,其强大功能常被手动配置的复杂步骤所掩盖。传统方法需要用户反…...
抖音批量下载器终极指南:5步实现无水印视频高效下载
抖音批量下载器终极指南:5步实现无水印视频高效下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
备考执业兽医考试哪里有免费资料可以领?
备战执业兽医考试,是不是还在四处搜罗备考资料?网上资源杂乱老旧、版本参差不齐,要么内容不全,要么找不到重点,浪费大把时间还没头绪。不用再盲目翻找、费心整理了!给大家推荐一个能免费领执业兽医全科资料…...
【ElevenLabs方言语音工程实战】:山东话TTS落地全流程(含音色克隆、韵律校准、鲁南/胶东口音适配)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs山东话语音工程全景概览 ElevenLabs 作为全球领先的AI语音合成平台,原生支持英语、西班牙语、法语等数十种主流语言,但对中文方言(如山东话)暂…...
Apache APISIX Dashboard:现代化API网关管理的架构演进与实践方案
Apache APISIX Dashboard:现代化API网关管理的架构演进与实践方案 【免费下载链接】apisix-dashboard Dashboard for Apache APISIX 项目地址: https://gitcode.com/gh_mirrors/ap/apisix-dashboard 在微服务架构日益普及的今天,API网关已成为连接…...
深入WCH USB主机IP:对比CH58x与CH32系列寄存器差异及CherryUSB适配心得
深入解析WCH USB主机IP:寄存器差异与CherryUSB适配实战 1. WCH USB主机IP架构概览 沁恒微电子(WCH)的CH58x/CH57x与CH32V/CH32F系列微控制器虽然采用不同的USB主机IP设计,但在协议栈层面保持了高度兼容性。这种设计哲学体现了硬件…...
海外渠道通知短信接口
在跨境业务体系中,企业常面临区域代理商分散、信息同步滞后、补货提醒不及时的问题,传统邮件、即时通讯易出现漏读、延迟,而国际渠道通知短信接口凭借触达稳定、实时性强的优势,成为跨境企业对接代理商的高效通信方案。本文从接口…...
Files.md:打造私密思考空间,兼具简洁实用与多样同步功能!
Files.md:专注思考的私密空间Files.md 是一款简洁的 .md 文件应用,为用户打造一个私密、安静的思考空间。用户可以用它存储生活中的一切,如笔记、文档、项目、日记、习惯记录、待办清单和任务等,所有内容都以纯 .md 文件形式保存&…...
智慧养殖与猪行为实例分割数据集 动物行为分析数据集 生猪进食数据集 生猪睡觉站立姿态识别数据集 yolo格式数据集
猪行为实例分割数据集核心信息 类别 Tags 标签 Instance Segmentation 实例分割 Model 模型Classes (4) 类别(4) Eating 进食 Lying 躺着 Sitting 坐着 Standing 站立数据集关键信息表信息类别具体内容数据集类别猪行为实例分割数据集,聚焦猪…...
