Python 选择用类或方法做装饰器的场景

news/2025/3/21 1:57:57/

在Python中,我们可以使用方法或者类来实现装饰器。选择使用方法还是类作为装饰器,主要取决于具体的应用场景。

使用方法作为装饰器

当装饰器的功能相对简单,不需要保持任何状态信息时,使用方法作为装饰器是一个不错的选择。这种情况下,装饰器通常只是对被装饰函数进行一些额外的操作,比如记录日志、增加权限检查等。

下面是一个简单的例子,使用方法作为装饰器实现日志记录功能:

python">def log_execution(func):def wrapper(*args, **kwargs):print(f"Calling function: {func.__name__}")result = func(*args, **kwargs)print(f"Function {func.__name__} returned: {result}")return resultreturn wrapper@log_execution
def add_numbers(a, b):return a + bresult = add_numbers(2, 3)
# Output:
# Calling function: add_numbers
# Function add_numbers returned: 5

在这个例子中,log_execution是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。新函数在执行被装饰的函数前后,分别打印函数名和返回值。

使用类作为装饰器

当装饰器需要保持一些状态信息,或者需要更复杂的功能时,使用类作为装饰器会更加合适。这种情况下,装饰器可以利用类的属性和方法来实现更复杂的逻辑。

下面是一个使用类作为装饰器的例子,实现一个缓存功能:

python">class cache:def __init__(self, func):self.func = funcself.cache = {}def __call__(self, *args, **kwargs):key = tuple(args) + tuple(kwargs.items())if key in self.cache:print(f"Returning cached result for {self.func.__name__}")return self.cache[key]else:result = self.func(*args, **kwargs)self.cache[key] = resultreturn result@cache
def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))
print(fibonacci(10))
# Output:
# Calculating fibonacci(10)
# 55
# Returning cached result for fibonacci
# 55

在这个例子中,cache是一个类,它充当装饰器的角色。cache类保存了被装饰函数的引用,以及一个缓存字典。当被装饰的函数fibonacci被调用时,cache类会先检查缓存中是否已经存在计算结果,如果存在则直接返回,否则计算结果并存入缓存。

总的来说,使用方法作为装饰器更适合于简单的装饰器功能,而使用类作为装饰器则更适合于需要保持状态信息或实现更复杂逻辑的场景。


http://www.ppmy.cn/news/1424487.html

相关文章

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进&#xff0c;以及万物互联时代的加速到来&#xff0c;信息技术产业正迎来前所未有的发展机遇。在这一背景下&#xff0c;成都知了汇智科技有限公司作为产教融合领域的先行者&#xff0c;积极响应国家号召&#xff0c;通过举办鸿蒙系列讲座进校园活…

Java方法(下)

1.1 方法的可变参数&#xff08;一般重要&#xff09; 规则要求 【修饰符】 class 类名{【①修饰符】 ②返回值类型 ③方法名(④数据类型... 参数名){⑤方法体语句;}【①修饰符】 ②返回值类型 ③方法名(④数据类型 参数名1, 数据类型 参数名2, 数据类型... 参数名3){⑤方法…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

K8S面试题学习

参考K8S面试题&#xff08;史上最全 持续更新&#xff09;_kubernetes常见面试题-CSDN博客做的个人总结&#xff0c;规划是每天看10题&#xff0c;thx&#xff01; 1.K8S是什么&#xff1f; 容器编排工具&#xff0c;主要用来管理容器化的一个应用&#xff0c;可以管理容器全…

PyTorch Scheduler动态调整学习率

文章目录 PyTorch动态调整学习率1.使用官方scheduler2.自定义scheduler参考 PyTorch动态调整学习率 深度学习中长久以来一直存在一个令人困扰的问题&#xff0c;那就是如何选择适当的学习率。如果学习速率设置得过小&#xff0c;会导致模型收敛速度缓慢&#xff0c;训练时间延…

在k8s集群中部署EdgeMesh

1. 前置准备 1.1 移除k8s master节点污点 如果k8s master节点上没有部署需要被代理的应用&#xff0c;也可以不执行此步骤&#xff1a; kubectl taint nodes --all node-role.kubernetes.io/master- 1.2 给 Kubernetes API 服务添加过滤标签 正常情况下你不会希望 EdgeMes…

C#生成一个绿色文件

生成一个绿色文件免去了安装的繁琐过程&#xff0c;直接运行&#xff0c;非常方便。 新建一个类库项目 在类库Class1中实现简单的Sum方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespac…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件&#xff0c;还可以将它们跨进程组成ActivityTask&#xff0c;这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看&#xff0c;Task有先后之分&#xff0c;源码实现上采取了…