一文掌握 Python 装饰器
什么是装饰器?
- 装饰器是一种特殊类型的函数,可以更改函数的默认行为。
- 装饰器可用于向函数或方法添加附加功能,例如缓存、日志记录或身份验证,而无需实际更改原始代码。
- 装饰器本质上是一个包装函数,它接受另一个函数作为参数并返回一个新函数,该新函数为原始函数添加了附加功能。装饰器通常用于简化代码,使其更加模块化,并减少所需的样板代码量。
装饰器如何工作?
要理解装饰器在 Python 中的工作原理,将它们视为一个两步过程会很有帮助:
- 定义了装饰器函数,它接受另一个函数作为参数。
- 装饰器函数返回一个新函数,该函数为原始函数添加了附加功能。
这是一个简单的例子来演示它是如何工作的:
def my_decorator(func):
def wrapper():
print("Before the function is called.")
func()
print("After the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello, world!")
- 在上面的示例中,my_decorator 是一个接受另一个函数作为参数 (func) 的函数。
- 然后它定义一个新函数(包装器),在调用 func 之前和之后打印一条消息。
- @my_decorator 语法是将装饰器应用到 say_hello 函数的一种简写方式。这相当于调用 say_hello = my_decorator(say_hello)。
- 当调用 say_hello 时,装饰器会自动应用,输出将如下所示:
Before the function is called.
Hello, world!
After the function is called.
需要使用Python装饰器的实时场景。
1. 测量执行时间
- 假设创建了一个方法,要检查它花费了多少时间。
import time
def measure_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"Execution time: {execution_time} seconds")
return result
return wrapper
@measure_time
def my_function():
time.sleep(2)
my_function()
2. 日志记录
- 假设您想使用下面的代码片段来记录您的函数,您可以轻松地做到这一点。
def log_function(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
print(f"Arguments: {args}")
print(f"Keyword Arguments: {kwargs}")
result = func(*args, **kwargs)
return result
return wrapper
@log_function
def my_function(x, y):
return x + y
print(my_function(2, 3))
3. 输入验证
- 下面的脚本用于验证调用函数时传递的参数。
def validate_input(func):
def wrapper(*args, **kwargs):
for arg in args:
if not isinstance(arg, int):
raise TypeError("Input arguments must be integers")
for value in kwargs.values():
if not isinstance(value, int):
raise TypeError("Keyword arguments must be integers")
return func(*args, **kwargs)
return wrapper
@validate_input
def add_numbers(a, b):
return a + b
print(add_numbers(2, 3))