Python中的装饰器是什么
装饰器是Python中的一种特殊语法结构,它允许我们在不修改原有函数的情况下,为函数添加额外的功能。装饰器可以用于日志记录、性能分析、输入验证等场景,同时也可以用于改变函数的行为,比如缓存函数结果等。
装饰器本质上是一个返回函数的高阶函数,它接受一个被装饰的函数作为参数,然后返回一个新的函数。新的函数通常在内部调用原函数,然后在其前后进行一些附加操作。我们可以直接使用@语法糖将装饰器应用到被装饰的函数上,这样就可以在函数定义时直接使用装饰器,而无需显式调用装饰器函数。
下面是一个简单的装饰器示例,用于记录函数的调用次数:
def count_calls(func):
def wrapper(*args, **kwargs):
wrapper.count += 1 # 在每次调用时增加计数
print(f"函数 {func.__name__} 被调用了 {wrapper.count} 次")
return func(*args, **kwargs)
wrapper.count = 0 # 初始调用次数为0
return wrapper
@count_calls
def say_hello():
print("Hello, world!")
say_hello()
say_hello()
输出结果为:
函数 say_hello 被调用了 1 次 Hello, world! 函数 say_hello 被调用了 2 次 Hello, world!
在上面的例子中,我们定义了一个装饰器函数 count_calls,它接受一个函数参数 func。在装饰器内部,我们定义了一个新的函数 wrapper,它记录了函数被调用的次数,并在每次调用时打印调用次数。然后,我们使用 @count_calls 将装饰器应用到 say_hello 函数上。
通过装饰器,我们可以在不修改 say_hello 函数本身的情况下,实现了对函数调用次数的记录功能。
下面是另一个常见的装饰器示例,用于计算函数执行时间:
import time
def calculate_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行时间:{end_time - start_time} 秒")
return result
return wrapper
@calculate_time
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(30))
输出结果为:
函数 fibonacci 执行时间:0.3524510860443115 秒 832040
在上面的例子中,我们定义了一个装饰器函数 calculate_time,它接受一个函数参数 func。在装饰器内部,我们定义了一个新的函数 wrapper,它在调用被装饰的函数前后记录了时间,并计算执行时间差。然后,我们使用 @calculate_time 将装饰器应用到 fibonacci 函数上。
通过装饰器,我们可以在不修改 fibonacci 函数本身的情况下,实现了对函数执行时间的计算功能。
除了上面的例子,装饰器还可以用于很多其他场景,如输入验证、权限控制、缓存等。装饰器为我们提供了一种简洁、灵活的方式来扩展函数的功能,使得函数的代码更加整洁,复用性更强。
