Python 装饰器是一种非常强大的功能,它可以让我们在不修改原函数的情况下,增加额外的功能。装饰器经常用于日志记录、认证、授权、缓存、事务处理等场景。
基本概念
装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。这个新的函数可以添加一些额外的功能,然后再返回。
def decorator(func):
def wrapper(*args, **kwargs):
# 在这里可以添加额外的功能
print("装饰器开始执行")
result = func(*args, **kwargs)
print("装饰器结束执行")
return result
return wrapper
@decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
在上面的例子中,decorator
函数是一个装饰器,它接收 say_hello
函数作为参数,并返回一个新的 wrapper
函数。wrapper
函数在执行 say_hello
函数之前和之后添加了打印语句。
常用装饰器
Python 中有很多常用的装饰器,以下是一些例子:
@staticmethod
和@classmethod
:用于将函数转换为静态方法和类方法。@property
:用于将函数转换为属性访问器。@functools.wraps
:用于保留原函数的名称和文档字符串。
高阶装饰器
高阶装饰器是接收装饰器作为参数的装饰器。它可以让我们对装饰器进行封装,从而实现更灵活的装饰器功能。
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Bob")
在上面的例子中,repeat
函数是一个高阶装饰器,它接收一个装饰器 decorator
作为参数,并返回一个新的装饰器 wrapper
。wrapper
函数会在执行原函数之前重复执行三次。
总结
Python 装饰器是一个非常强大的功能,它可以让我们在不修改原函数的情况下,增加额外的功能。通过理解装饰器的基本概念、常用装饰器和高阶装饰器,我们可以更好地利用这个功能来提高代码的灵活性和可维护性。