Python 装饰器
装饰器(Decorator)是 Python 中的一种高级函数,它允许你在不修改函数定义的情况下,动态地扩展或修改函数的功能。装饰器本质上是一个返回函数的函数,可以将一个函数作为输入,并返回一个增强后的函数。
装饰器的基本概念
装饰器通常用于以下几种场景:
- 增强函数功能:在不改变原函数代码的情况下,添加额外的功能。
- 代码复用:通过装饰器,可以将一些常用的功能封装起来,避免代码重复。
- 代码清晰:使用装饰器可以使代码结构更加清晰和模块化。
装饰器的基本语法
装饰器的基本语法使用 @
符号,放在函数定义的前一行。例如:
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
在这个例子中, my_decorator
是一个装饰器,它接收一个函数 func
作为参数,并返回一个新的函数 wrapper
。当你调用 say_hello()
时,实际上调用的是 wrapper
函数,从而在不修改 say_hello
函数的情况下,扩展了它的功能。
带参数的装饰器
装饰器不仅可以用于不带参数的函数,也可以用于带参数的函数。例如:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Something is happening before the function is called.")
result = func(*args, **kwargs)
print("Something is happening after the function is called.")
return result
return wrapper
@my_decorator
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
在这个例子中, wrapper
函数使用了 *args
和 **kwargs
来接受所有位置参数和关键字参数,并将这些参数传递给 func
,确保装饰器可以用于任意参数的函数。
带参数的装饰器函数
如果你需要让装饰器本身接受参数,可以使用三层嵌套的函数结构。例如:
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Hello!")
say_hello()
在这个例子中,repeat
是一个返回装饰器的函数,它接收一个参数 n
,表示需要调用的次数。 decorator
是实际的装饰器,而 wrapper
是增强后的函数。
总结
装饰器是一个强大的工具,允许你在不改变函数定义的情况下,动态地扩展或修改函数的行为。它们广泛应用于日志记录、性能测量、访问控制等场景。通过使用装饰器,可以使代码更加模块化、清晰和可维护。