Python装饰器:从基础到高级用法
原创
1. 引言
在Python中,装饰器是一种特殊类型的函数,它可以修改其他函数的行为或功能。装饰器的本质是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增长额外功能,装饰器的返回值也是一个函数对象。
2. 基础装饰器
基础装饰器是最易懂的装饰器形式,通常用于在不修改原函数代码的情况下,给函数添加一些额外的功能。例如,我们可以创建一个记录函数执行时间的装饰器:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 运行时间:{end_time - start_time}秒")
return result
return wrapper
@timer_decorator
def my_function():
time.sleep(2)
my_function()
3. 带参数的装饰器
有时候,我们需要创建可以接受参数的装饰器。这可以通过定义一个返回装饰器的函数来实现。例如,我们可以创建一个可以通过不同日志级别记录信息的装饰器:
def log_decorator(log_level):
def decorator(func):
def wrapper(*args, **kwargs):
if log_level == "INFO":
print(f"INFO: 正在调用 {func.__name__}")
elif log_level == "DEBUG":
print(f"DEBUG: 正在调用 {func.__name__}")
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@log_decorator("INFO")
def my_function():
pass
my_function()
4. 类装饰器
除了函数装饰器,Python还拥护类装饰器。类装饰器通过定义一个类,该类需要实现`__call__`方法,让类的实例可以像函数一样被调用。类装饰器可以更加灵活地处理装饰逻辑,并且可以更容易地维护状态。
class CountCalls:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print(f"第 {self.num_calls} 次调用 {self.func.__name__}")
return self.func(*args, **kwargs)
@CountCalls
def my_function():
pass
my_function()
my_function()
5. 装饰器顺序
当一个函数被多个装饰器装饰时,装饰器的应用顺序是从下到上,即最接近函数定义的装饰器先被应用。这意味着,当你有多个装饰器时,你需要从内到外阅读它们。
6. 内置装饰器
Python提供了一些内置的装饰器,如`@staticmethod`、`@classmethod`和`@property`,这些装饰器用于改变方法的调用行为或为类添加属性。
7. 总结
装饰器是Python中的一个强劲特性,它允许我们以声明式的行为修改或强化函数的行为。无论是基础的函数装饰器,还是更纷乱的带参数装饰器和类装饰器,都能帮助我们编写出更加简洁和可维护的代码。掌握装饰器的使用,将使你的Python编程技能更上一层楼。