Python 装饰器的学习笔记
- 0. Python 装饰器的说明
- 1. 装饰器的基本结构
- 2. 使用装饰器
- 3. 带参数的装饰器
- 4. 类装饰器
0. Python 装饰器的说明
装饰器是Python中一个非常强大的功能,它允许程序员扩展或修改函数的行为而不改变函数本身的代码。装饰器本质上是一个接受函数作为参数并返回一个新函数的函数。装饰器通常用于日志记录、性能测试、事务处理、权限校验等场景。
装饰器是一种特殊类型的函数,它可以用来修改其他函数的功能。装饰器在定义时使用@
符号加装饰器名放在函数定义上方。
1. 装饰器的基本结构
def decorator(func):def wrapper(*args, **kwargs):# 在函数执行前可以执行一些操作result = func(*args, **kwargs) # 调用原始函数# 在函数执行后可以执行一些操作return resultreturn wrapper
2. 使用装饰器
在Python中,使用@
符号加装饰器名放在函数定义上方来应用装饰器。
@decorator
def function_to_decorate():pass
这等价于,
def function_to_decorate():passfunction_to_decorate = decorator(function_to_decorate)
简单的日志记录装饰器示例,
def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned {result}")return resultreturn wrapper@log_decorator
def add(x, y):return x + yprint(add(3, 4))
输出,
Calling add with arguments (3, 4) and keyword arguments {}
add returned 7
7
3. 带参数的装饰器
装饰器本身也可以接受参数。这种情况下,你需要定义一个返回装饰器的函数。
示例,
def repeat(number=3):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(number):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat@repeat(number=5)
def greet(name):print(f"Hello, {name}!")greet("World")
输出,
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
4. 类装饰器
除了函数之外,Python也支持类装饰器。类装饰器通常通过实现__call__
方法来工作。
示例,
class CountCalls:def __init__(self, func):self.func = funcself.calls = 0def __call__(self, *args, **kwargs):self.calls += 1print(f"Call {self.calls} of {self.func.__name__}")return self.func(*args, **kwargs)@CountCalls
def say_hello():print("Hello!")say_hello()
say_hello()
输出,
Call 1 of say_hello
Hello!
Call 2 of say_hello
Hello!
在这个例子中,CountCalls
是一个类装饰器,它记录了函数被调用的次数。
装饰器是Python高级编程中的一个重要概念,它提供了一种优雅的方式来增强函数的行为。正确使用装饰器可以使得代码更加清晰和可维护。
完结!