📅  最后修改于: 2023-12-03 15:04:41.867000             🧑  作者: Mango
Python装饰器是一种强大的语法特性,它可以在不改变原始函数代码的情况下,通过在函数定义之前使用特殊的语法进行扩展和修改函数的行为。
装饰器提供了一种简洁而优雅的方式来修改函数或类的行为。它们可以用于很多场景,例如:
使用装饰器的好处包括:
装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器的使用方式是在要扩展或修改的函数定义之前,通过在函数名前面加上装饰器来使用。
下面是一个简单的例子,演示如何使用装饰器来记录函数的执行时间:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("函数 {} 的执行时间为 {} 秒".format(func.__name__, end_time - start_time))
return result
return wrapper
@timer_decorator
def my_function():
# 函数逻辑代码
pass
my_function()
在上面的例子中,timer_decorator
是一个装饰器函数,它接受一个函数作为参数,并定义了一个内部函数 wrapper
。wrapper
函数在调用原始函数之前和之后执行了额外的逻辑,用于计算函数的执行时间。
通过 @timer_decorator
将装饰器应用到 my_function
上,实际上相当于执行了 my_function = timer_decorator(my_function)
这一行代码。这样,在调用 my_function
时,实际上执行的是 wrapper
函数,从而实现了记录函数执行时间的功能。
除了上述基本用法外,装饰器还有一些高级应用。
装饰器可以接受参数,这样可以在使用装饰器时传入一些配置或选项。
def parametrized_decorator(param1, param2):
def decorator(func):
def wrapper(*args, **kwargs):
# 使用参数 param1 和 param2
print("装饰器参数:", param1, param2)
return func(*args, **kwargs)
return wrapper
return decorator
@parametrized_decorator("参数1", "参数2")
def my_function():
# 函数逻辑代码
pass
my_function()
在上面的例子中,parametrized_decorator
是一个带参数的装饰器,它返回一个装饰器函数 decorator
,decorator
函数再返回真正用来包装函数的 wrapper
函数。通过给 parametrized_decorator
传递参数,可以在装饰器内部使用这些参数。
除了函数装饰器,Python 还支持类装饰器。类装饰器是指实现了 __call__
方法的类,它可以像函数装饰器一样使用。
class Decorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
# 装饰器逻辑
print("装饰器执行")
return self.func(*args, **kwargs)
@Decorator
def my_function():
# 函数逻辑代码
pass
my_function()
在上面的例子中,Decorator
是一个类装饰器,它的 __init__
方法接受一个函数作为参数,并将其保存为实例变量 func
。__call__
方法定义了装饰器的逻辑,在调用被装饰的函数之前和之后执行一些操作。
Python装饰器是一种强大且灵活的语法特性,可以在不修改原始函数代码的情况下修改函数的行为。装饰器可以用来添加额外的功能、验证和授权、修改输入输出等。通过装饰器,可以使代码更加清晰、可维护,并且可以灵活地组合和嵌套使用。掌握装饰器的使用和高级用法,对于程序员来说是一项重要的技能。