python @装饰器的用法

装饰器(decorators)是 Python 中的一种高级特性,它允许开发者修改函数或方法的行为,而不改变其定义。装饰器通常用于日志记录、权限检查、性能测量等场景。装饰器是通过在函数定义的前一行加上 @decorator_name 来使用的。

基本用法

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。以下是一个简单的装饰器示例:

def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()

输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

在这个例子中:

  • my_decorator 是装饰器函数。
  • say_hello 是被装饰的函数。
  • @my_decorator 语法相当于 say_hello = my_decorator(say_hello)

带参数的装饰器

如果需要在装饰器中传递参数,可以使用多层嵌套函数来实现:

def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):func(*args, **kwargs)return wrapperreturn decorator_repeat@repeat(num_times=3)
def greet(name):print(f"Hello {name}")greet("World")

输出:

Hello World
Hello World
Hello World

在这个例子中:

  • repeat 是一个带参数的装饰器工厂,它返回一个装饰器。
  • decorator_repeat 是实际的装饰器。
  • wrapper 是包装函数,负责多次调用被装饰的函数 func

类装饰器

装饰器也可以用于类。类装饰器是通过定义一个实现 __call__ 方法的类来实现的:

class MyDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("Class-based decorator before function call.")result = self.func(*args, **kwargs)print("Class-based decorator after function call.")return result@MyDecorator
def say_goodbye():print("Goodbye!")say_goodbye()

输出:

Class-based decorator before function call.
Goodbye!
Class-based decorator after function call.

在这个例子中:

  • MyDecorator 类实现了 __call__ 方法,使其实例可以像函数一样被调用。
  • say_goodbye 函数被 MyDecorator 实例装饰。

装饰器的实际应用

装饰器在实际开发中非常有用,以下是一些常见的应用场景:

  1. 日志记录:在函数执行前后记录日志。
  2. 权限检查:在执行函数前检查用户是否有权限。
  3. 性能测量:计算函数执行时间。
  4. 缓存:缓存函数的返回值,以提高性能。
  5. 输入校验:在函数执行前校验输入参数。

示例:日志记录装饰器

import functoolsdef log_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with {args} and {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned {result}")return resultreturn wrapper@log_decorator
def add(a, b):return a + badd(2, 3)

输出:

Calling add with (2, 3) and {}
add returned 5

在这个例子中:

  • @functools.wraps(func) 保留了被装饰函数的元数据(如文档字符串和函数名)。
  • log_decorator 在函数执行前后打印日志信息。

装饰器是一个强大而灵活的工具,能够极大地增强代码的可复用性和可读性。通过合理使用装饰器,可以使代码更加简洁、优雅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/38779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt简单文本查找

Qt版本&#xff1a; Qt6 具体代码&#xff1a; 1. 头文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QLineEdit; class QDialog; class QPushButton; class QVBoxLayout; class QTextEdit;QT_BEGIN_NAMESPACE namespace Ui…

为什么AI算法工程师要求C++?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c&#xff0b;&#xff0b;的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能跑出…

找到字符串中所有子串出现的位置python

直接find干就完了。 如果你希望找到字符串中所有子串出现的位置&#xff0c;而不仅仅是一个位置&#xff0c;你可以通过循环查找并收集所有起始位置。以下是修改后的代码&#xff1a; def find_all_substring_positions(string, substring): positions [] # 用于存储所有…

与枚举结合的策略模式

枚举类&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…

VTK- 可视化过程 四种坐标系统

可视化工具包 VTK(Visualization Toolkit),是一种开源的可视化软件系统,主要实现计算机图形学、图像分析、渲染、图像处理等功能。VTK 包含一个 C类库和多个不同语言调用接口层&#xff0c;主要针对2D、3D 图像和可视化用图设计。 VTK设计作为一个工具包&#xff0c;不依赖于特…

学校卫星电子怎么自动校准时间呢

在学校的教室里&#xff0c;卫星电子钟精准地为师生们提供着时间服务&#xff0c;而其自动校准时间的功能令人称奇。那么&#xff0c;学校卫星电子钟是如何实现自动校准时间的呢&#xff1f; 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…

知迪科技惊艳亮相高工智能汽车开发者大会,精彩演讲直击行业痛点、探索未来趋势

6月27-28日&#xff0c;高工智能汽车开发者大会在上海隆重举行&#xff0c;知迪科技受邀携产品与解决方案出席此次大会。 智能汽车已经进入跨域融合新时代。为了进一步降低成本和增强协同&#xff0c;汽车电子架构的设计开始向跨域融合方向演进&#xff0c;并且变革的速度在加快…

java 面试题 - 索引

上脑图&#xff0c;大家要记住&#xff01;&#xff01; 看不清&#xff0c;上大图&#xff01; 这几总结就够用&#xff01;&#xff01;

nginx优化和防盗链

1、隐藏版本号 [roottest1 conf]# vim nginx.conf ​ server_tokens off; ​ 2、防盗链 修改用户和所在组 [roottest1 conf]# vim nginx.conf ​ #user nginx nginx; #表示主进程master会有root创建&#xff0c;子进程会有nginx用户来创建。 3、设置页面的缓存时间 主要是…

ExoPlayer架构详解与源码分析(14)——ProgressiveMediaPeriod

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

高考完的假期想学c语言 要注意那些问题?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;其实建议高考完之后好好玩一…

线上问题定位分析宝典——Linux中定位JVM问题常用命令

查询Java进程ID #ps axu | grep java #ps elf | grep java查看机器负载及CPU信息 #top -p 1(进程ID) #top (查看所有进程)获取CPU飙升线程堆栈 1. top -c 找到CPU飙升进程ID&#xff1b; 2. top -Hbp 9702(替换成进程ID) 找到CPU飙升线程ID&#xff1b; 3. $ printf &quo…

Java 7新特性深度解析:提升效率与功能

文章目录 Java 7新特性深度解析&#xff1a;提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理&#xff08;捕获多个异常&#xff09;四、增强泛型推断五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292与InvokeDynamic七、Path接口…

64.ThreadLocal造成的内存泄漏

内存泄漏 程序中已动态分配的堆内存,由于某种原因程序为释放和无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏的堆积终将导致内存溢出。 内存溢出 没有足够的内存提供申请者使用。 ThreadLocal出现内存泄漏的真实原因 内存泄漏的发…

Java中的多线程与并发编程详解

Java中的多线程与并发编程详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今软件开发中&#xff0c;利用多核处理器的能力并行执行任务已成为提高应用…

Transformer拆积木

文章目录 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 参考 学一下已经问鼎中原七年之久的Transformer Concepts 开始拆积木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…

【文档+源码+调试讲解】科研经费管理系统

目 录 目 录 摘 要 ABSTRACT 1 绪论 1.1 课题背景 1.2 研究现状 1.3 研究内容 2 系统开发环境 2.1 vue技术 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 SSM框架技术 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3 经济可行性 3.1…

解析服务器地址异常的原因和解决方法

在网络利用开发和运维进程中&#xff0c;解析服务器地址异常是常见的问题之一。特别是在触及到跨境业务和国际网络传输时&#xff0c;由于网络环境的复杂性&#xff0c;解析服务器地址异常可能会致使用户没法正常访问网站或利用程序。 解析服务器地址异常可能由多种缘由引发&am…

虚拟机的网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近&#xff0c;坚持就是胜利的序曲 一 …

手机系统设置选项

通用设置选项 1. 忽略电池优化选项 参考 https://blog.csdn.net/dodod2012/article/details/132045963 <uses-permission android:name"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>public static boolean isIgnoreBatteryOption(Context c…