在Python中,装饰器(decorator)是一种高级功能,它允许你在不修改函数本身代码的情况下,为函数或方法添加新的功能。装饰器本质上是一个接收函数作为参数,并返回一个新函数的函数。这个新函数通常会调用并扩展原始函数的行为。
装饰器使用@
语法来应用。下面是一个简单的装饰器示例,它展示了如何创建一个装饰器来记录函数的执行时间:
python复制代码
import time | |
def timing_decorator(func): | |
def wrapper(*args, **kwargs): | |
start_time = time.time() | |
result = func(*args, **kwargs) | |
end_time = time.time() | |
elapsed_time = end_time - start_time | |
print(f"Function {func.__name__} executed in {elapsed_time:.4f} seconds") | |
return result | |
return wrapper | |
@timing_decorator | |
def example_function(seconds): | |
print(f"Sleeping for {seconds} seconds...") | |
time.sleep(seconds) | |
print("Done sleeping!") | |
# 调用装饰后的函数 | |
example_function(2) |
在这个例子中:
timing_decorator
是一个装饰器函数,它接收一个函数func
作为参数。wrapper
是装饰器内部定义的一个包装函数,它会在调用原始函数func
之前和之后执行一些额外的操作(在这个例子中是记录执行时间)。*args
和**kwargs
允许wrapper
函数接收任意数量的位置参数和关键字参数,并将它们传递给原始函数func
。@timing_decorator
语法将example_function
函数装饰为timing_decorator(example_function)
的返回值,即wrapper
函数。- 当调用
example_function(2)
时,实际上是在调用wrapper(2)
,后者会记录执行时间并调用原始的example_function
。
装饰器可以链式调用,即一个函数可以被多个装饰器装饰。装饰器的应用顺序是从下到上的,但执行顺序是从上到下的(即先应用的装饰器后执行,后应用的装饰器先执行)。
装饰器不仅限于函数,还可以用于装饰类的方法(包括静态方法和类方法),但需要注意的一点是,当装饰类的方法时,self
或 cls
参数(分别对应实例方法和类方法)会被正确地传递给被装饰的方法。
装饰器是Python中一种非常强大且灵活的工具,可以用于日志记录、性能测试、事务处理、缓存、权限校验等多种场景。