Python装饰器(自定义装饰器和3个内置装饰器)
目录
装饰器
函数作为参数
简单的装饰器
代参的装饰器
1. *args
2.**kwargs
💡 小贴士:使用 functools.wraps
Python内置装饰器
1.@property
2.@staticmethod
3.@classmethod
📌 类方法的特点:
装饰器
装饰器(Decorator) 是一种用于 修改或增强函数行为 的语法糖。它本质上是一个 接受函数作为参数并返回一个新函数的可调用对象(通常是函数或类)
特性 | 说明 |
装饰器本质 | 一个函数或类,接收函数并返回包装后的函数 |
语法 | 使用 简化调用 |
参数支持 | 可以处理任意数量和类型的参数(使用 和 ) |
多层装饰器 | 执行顺序是从内到外(最靠近函数的先执行) |
保留函数元信息 | 推荐使用 |
高级应用 | 类装饰器、带参数的装饰器、装饰器工厂等 |
函数作为参数
简单的装饰器
注:
箭头所指处是等价的
代参的装饰器
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
装饰器。
没有使用 @wraps
,add
函数的元信息被覆盖了。
Python内置装饰器
1.@property
我们在此建立的内容将会被视作属性
内置装饰器,它允许你将一个方法“伪装”成属性访问,从而实现对属性的更精细控制(例如:封装、验证、延迟计算等),同时保持代码简洁易读。
在面向对象编程中,直接暴露实例变量可能会导致数据被随意修改,缺乏安全性。而通过方法来获取和设置属性又不够直观。@property
提供了一个优雅的中间方案:
- 可以像访问属性一样调用方法(无需括号)
- 可以在赋值时进行校验
- 可以隐藏内部实现细节
访问时无需括号也不能被修改
2.@staticmethod
静态方法是一种属于类、但不依赖于类实例(也不需要 self
或 cls
参数)的方法。你可以通过类或实例来调用它,但它不会自动接收类或实例的引用。
静态方法的特点:
- 不需要
self
或cls
参数。 - 可以直接访问类变量(但通常建议使用类名访问)。
- 不能修改类或实例的状态(因为没有对
self
或cls
的引用)。 - 常用于工具函数、逻辑上与类相关但不需要实例化的方法。
这个方法可以被放在程序的任何位置,都不会影响这个类
我们在调用这个方法时不需要创造任何类
3.@classmethod
它将一个方法绑定到类而不是实例。与普通方法不同的是,类方法会自动接收类本身作为第一个参数(通常命名为 cls
),而不是实例(self
)。
📌 类方法的特点:
特点 | 说明 |
自动传入第一个参数 | 是,是类本身(约定为 ) |
可否访问类属性 | ✅ 是 |
可否修改类属性 | ✅ 是 |
可否访问实例属性 | ❌ 否,因为没有 |
调用方式 | 可通过类或实例调用 |
类方法会影响整个类本身