首页 > 编程语言 >告别复杂判断!Python 中实现函数重载的终极技巧

告别复杂判断!Python 中实现函数重载的终极技巧

时间:2024-11-10 21:21:07浏览次数:1  
标签:log cfqw Python str 重载 message 终极 com

引言
说到函数重载,学过 Java 的同学应该不陌生,最常用的地方应该就是打印 log 了,对于不同的参数,调用的是不同的重载函数。那么 Python 如何实现函数重载呢?

重载概念
函数重载是指在同一作用域内,允许多个同名函数存在,但它们的参数列表不同。虽然许多编程语言(如 Java 和 C++)支持函数重载,但 Python 的设计哲学使其不能直接支持这一特性。

不使用重载
先看一个例子,在不使用重载的情况下,实现一个 log 函数:

from attr import dataclass

@dataclass
class MyException(Exception):
msg: str

def 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 singledispatch

from 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 singledispatch

from 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: str
unit_price: float
quantity_on_hand: int = 0

def 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 = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand

cfqw.seemlgo.com
cfqw.shyachao.com
cfqw.dhl-d.com
cfqw.tajqzl.com
cfqw.hzsunbyte.com
cfqw.tjzxjy.com
cfqw.qrpress.com
cfqw.zhanhao118.com
cfqw.marsdrinkschina.com
cfqw.xjlqcl.com
cfqw.5000news.com
cfqw.2500trip.com
cfqw.htsyfs.com
cfqw.hmgjjd.com
cfqw.tcccpsb.com
cfqw.hfsmttp.com
cfqw.nnlianbao.com
cfqw.xinchengabc.com
cfqw.njns56.com
cfqw.gzlcjzs.com
cfqw.xinlvchuang.com
cfqw.juanbanjicj.com
cfqw.tongtaijituan.com
cfqw.lydsmp.com
cfqw.shinenergygroup.com
cfqw.jingranchimian.com
cfqw.tj-shengming.com
cfqw.njxlkhs.com
cfqw.shzljr.com
cfqw.guanlinyouxuan.com
cfqw.ynyoutu.com
cfqw.jiadalong.com
cfqw.jumeizi.com
cfqw.zhs888.com
cfqw.cnaoxin.com
cfqw.afu365.com
cfqw.tzhyex.com
cfqw.xincaiit.com
cfqw.senmaohuanbao.com
cfqw.bjqunlemuye.com
cfqw.lxtxqh.com
cfqw.yuchentimes.com
cfqw.hebeihongqi.com
cfqw.ssyhmma.com
cfqw.hyl98.com
cfqw.youhezhixuan.com
cfqw.jilinsport.com
cfqw.wychyq.com
cfqw.gdhrgk.com
cfqw.jzha101.com
cfqw.lutuohb.com
cfqw.sgxinfeng.com
cfqw.bjyongxuan.com
cfqw.jxtrfund.com
cfqw.fyjyzsgs.com
cfqw.zgygzl.com
cfqw.clwzycgp.com
cfqw.wencfcw.com
cfqw.zmuoo.com
cfqw.xphysc.com
cfqw.kalilan.com
cfqw.jiexinlong.com
cfqw.shiyongsh.com
cfqw.myjhedu.com
cfqw.xczipper.com
cfqw.yjlzk.com
cfqw.huangpihushuichan.com
cfqw.yifanyuanyang.com
cfqw.dianyunzhisheng.com
cfqw.jx-tq.com

所以 @dataclass 可以帮助我们简化代码,提升开发效率,具体的用法可以参考官方文档。

总结
在 Python 中,虽然不支持传统的函数重载,但我们可以通过 functools.singledispatch 方法来实现类似的功能。同时,需要注意一下,只有第一个参数的不同类型会被重载,后面参数的类型变化会被忽略。

标签:log,cfqw,Python,str,重载,message,终极,com
From: https://www.cnblogs.com/bkbk123/p/18538519

相关文章

  • 如何正确保护 Python 代码,不是 Pyinstaller
    引言在开发Python软件或者脚本时,为了保护Python代码不被盗用或篡改,我们需要借助一些工具来保护我们的源代码。通常情况下,我们可能会用Pyinstaller来保护我们的代码,并且将代码打包成可以在任何电脑上运行的单个文件。但是,Pyinstaller打包后的程序,只是将源代码编译成了pyc......
  • 怎么启动python脚本文件
    创建一个简单的python入门代码,以便示范。存储文件并复制该python文件的存储路径。使用cd命令切换工作目录到python文件所在的目录。输入变量环境中的python路径和python文件的名字。回车执行后,可完成命令行的python文件运行。......
  • 如何用python求导数
    打开python运行环境。导入微分的模块包:fromsympyimport*。定义符号变量:x=symbols('x')定义一个函数:f=x**9diff=diff(f,x)求导最后输入diff,即可显示其变量值了。......
  • Python decimal模块用法
    decimal模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。    在Python中,将变量声明为 Decimal 类型通常用于需要高精度和小数运算的场合。Decimal 类型属于 deci......
  • 【Python知识宝库】快速了解 `isinstance()` 的原理、作用和使用场景
    ......
  • python+flask计算机毕业设计航空公司货运管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于航空公司货运管理系统的研究,现有研究多侧重于航空货运的某一单独环节,如货运流程优化或者资源配置等方面。专门针对航空公司货运管......
  • python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表
    python-26-PythonORM系列之pymysql实现对数据库的增删改查及新建表一.简介在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy;PyMySQL—MySQL数据库驱动,用于与MySQL数据库......
  • 三十六、Python基础语法(JSON操作)
    JSON(JavaScriptObjectNotation)是一种基于文本,轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成,在自动化测试中经常用来存放测试数据。JSON的特点:基于文本,不包含图片、音视频轻量级,定义相同数据量,JSON占用文件比较小独立于语言,所有编程语言都可以使......
  • Vue3 + Pinia:轻松存储数据的终极指南
    Hey小伙伴们!今天我们要聊的是Vue3中一个非常强大的状态管理库——Pinia。Pinia不仅简化了状态管理的复杂度,还提供了丰富的功能,让你在存储数据时更加得心应手。让我们一起来看看如何在Vue3项目中使用Pinia存储数据吧!......
  • Python从0到100(六十九):Python OpenCV-图像加噪与滤波
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......