Python装饰器是一种高阶函数,它们可以修改或增强函数的行为。以下是对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()
输出:
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
带参数的装饰器:
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
value = func(*args, **kwargs)
return value
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet(name):
print(f"Hello {name}!")
greet("World")
输出:
Hello World!
Hello World!
Hello World!
装饰器工厂:
def decorator_with_args(decorator_arg):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Debug level is {decorator_arg}")
return func(*args, **kwargs)
return wrapper
return decorator
@decorator_with_args(decorator_arg=5)
def some_function():
print("Function is executing.")
some_function()
输出:
Debug level is 5
Function is executing.
装饰器应用多个:
def debug(level):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Debug level: {level}")
return func(*args, **kwargs)
return wrapper
return decorator
def log_call():
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Function {func.__name__} is called with {args} {kwargs}")
return func(*args, **kwargs)
return wrapper
return decorator
@debug(level=1)
@log_call
def add(x, y):
return x + y
result = add(5, 3)
输出:
Function add is called with (5, 3) {}
Debug level: 1
8