当前位置: 首页 > news >正文

Python装饰器(自定义装饰器和3个内置装饰器)

目录

装饰器

函数作为参数

简单的装饰器

代参的装饰器

1. *args

2.**kwargs

💡 小贴士:使用 functools.wraps

Python内置装饰器

1.@property

2.@staticmethod

3.@classmethod

📌 类方法的特点:


装饰器

装饰器(Decorator) 是一种用于 修改或增强函数行为 的语法糖。它本质上是一个 接受函数作为参数并返回一个新函数的可调用对象(通常是函数或类)

特性

说明

装饰器本质

一个函数或类,接收函数并返回包装后的函数

语法

使用 @decorator

简化调用

参数支持

可以处理任意数量和类型的参数(使用 *args

**kwargs

多层装饰器

执行顺序是从内到外(最靠近函数的先执行)

保留函数元信息

推荐使用 functools.wraps

高级应用

类装饰器、带参数的装饰器、装饰器工厂等

函数作为参数

简单的装饰器

注:

箭头所指处是等价的

代参的装饰器

1. *args

  • 收集所有位置参数(positional arguments)。
  • 以元组形式保存。

2.**kwargs

  • 收集所有关键字参数(keyword arguments)。
  • 以字典形式保存。

同时使用两者来确保装饰器可以处理任意类型的参数

💡 小贴士:使用 functools.wraps

在写装饰器时,建议使用 from functools import wraps 来保留原函数的元信息(如文档字符串、名字等):

from functools import wrapsdef my_decorator(func):@wraps(func)def wrapper(*args, **kwargs):return func(*args, **kwargs)return wrapper

当你编写装饰器时,默认情况下会丢失被装饰函数的一些元信息(如函数名、文档字符串、注解等)。为了保留这些信息,可以使用 functools 模块中的 @wraps 装饰器。

没有使用 @wrapsadd 函数的元信息被覆盖了。

Python内置装饰器

1.@property

我们在此建立的内容将会被视作属性

内置装饰器,它允许你将一个方法“伪装”成属性访问,从而实现对属性的更精细控制(例如:封装、验证、延迟计算等),同时保持代码简洁易读。

在面向对象编程中,直接暴露实例变量可能会导致数据被随意修改,缺乏安全性。而通过方法来获取和设置属性又不够直观。@property 提供了一个优雅的中间方案:

  • 可以像访问属性一样调用方法(无需括号)
  • 可以在赋值时进行校验
  • 可以隐藏内部实现细节

访问时无需括号也不能被修改

2.@staticmethod

静态方法是一种属于类、但不依赖于类实例(也不需要 selfcls 参数)的方法。你可以通过类或实例来调用它,但它不会自动接收类或实例的引用。

静态方法的特点:

  • 不需要 selfcls 参数。
  • 可以直接访问类变量(但通常建议使用类名访问)。
  • 不能修改类或实例的状态(因为没有对 selfcls 的引用)。
  • 常用于工具函数、逻辑上与类相关但不需要实例化的方法。

这个方法可以被放在程序的任何位置,都不会影响这个类

我们在调用这个方法时不需要创造任何类

3.@classmethod

它将一个方法绑定到类而不是实例。与普通方法不同的是,类方法会自动接收类本身作为第一个参数(通常命名为 cls),而不是实例(self)。

📌 类方法的特点:

特点

说明

自动传入第一个参数

是,是类本身(约定为 cls

可否访问类属性

✅ 是

可否修改类属性

✅ 是

可否访问实例属性

❌ 否,因为没有 self

调用方式

可通过类或实例调用

类方法会影响整个类本身

http://www.dtcms.com/a/277883.html

相关文章:

  • Java反射机制深度解析
  • 树莓派5-ollama-linux-arm64.tgz 下载
  • AEC线性处理
  • 在 OCI 生成式 AI 上搭一个「指定地区拉面店 MCP Server」——从 0 到 1 实战记录
  • 《数据库》MySQL事务
  • gcc 源码阅读--C语言预处理
  • (一)SAP Group Reporting (GR) 集团财务合并解决方案套件概述
  • 构造函数延伸应用
  • [Python 基础课程]字典
  • 代码随想录算法训练营第十七天
  • spring--@Autowired
  • LlamaIndex Querying 自定义查询
  • JavaScript数据结构算法
  • js入门01
  • YOLOv5目标检测标准化流程
  • 013_流式输出与实时响应
  • 【SSM】SpringBoot 实现邮件发送
  • Typecho博客新文章自动添加“New“标签的实现方案
  • 热点代码探测确定何时JITTest01
  • 16. JVM调优工具
  • 华为OD 处理器
  • 格密码--LWE,DLWE和ss-LWE
  • 【王树森推荐系统】重排04:DPP 多样性算法(上)
  • python学习打卡:DAY 45 Tensorboard使用介绍
  • 言语理解高频词之生僻成语
  • 驱动开发(3)|rk356x驱动GPIO基础应用之点亮led灯
  • idea docker插件连接docker失败
  • [RPA] 批量数据抓取指定商品名称信息
  • Pandas-数据清洗与处理
  • Spring高级特性——反射和动态代理的性能优化