Python装饰器-为函数添加额外的功能
发布时间:2023-12-03 10:25:58
Python的装饰器是一种很有用的功能,可以为函数添加额外的功能,而不需要对函数本身进行修改。
装饰器本质上是一个函数,它接受目标函数作为参数,并返回一个新的函数。这个新的函数执行了目标函数,并在执行前后可以做一些额外的操作,比如打印日志、计时等。
使用装饰器的语法是在目标函数的定义上加上@符号,后面跟上装饰器函数的名字。例如:
@decorator
def target_function():
...
下面以一个简单的例子来说明装饰器的用法。
import time
# 定义一个装饰器函数,用来计时
def timer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time}s to run")
return wrapper
# 定义一个目标函数
@timer
def my_function():
time.sleep(1)
print("Function is running")
# 调用目标函数
my_function()
运行上面的代码,会输出以下结果:
Function is running Function my_function took 1.0002076625823975s to run
可以看到,装饰器函数timer在调用my_function之前先记录了开始时间,然后调用目标函数,最后再记录结束时间并打印出函数执行时间。
除了计时以外,装饰器还可以应用于很多其他的场景。比如,可以用装饰器来实现函数的缓存,这样可以避免重复计算;还可以用装饰器来实现权限验证,只有具有特定权限的用户才能调用目标函数;还可以用装饰器来实现日志记录,记录函数的输入参数和返回结果等等。
下面是一个示例,展示了如何使用装饰器来实现函数的缓存。
# 定义一个装饰器函数,实现函数的缓存
def cache(func):
result_cache = {}
def wrapper(*args):
if args in result_cache:
print("Get result from cache")
return result_cache[args]
else:
result = func(*args)
result_cache[args] = result
return result
return wrapper
# 定义一个目标函数,计算斐波那契数列
@cache
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 调用目标函数
print(fibonacci(10))
print(fibonacci(10))
运行上面的代码,会输出以下结果:
55 Get result from cache 55
可以看到,在第一次调用fibonacci(10)时,会进行正常的计算过程,并把结果缓存起来。然后,第二次调用fibonacci(10)时,会直接从缓存中取出结果,而不再进行重复的计算。
总结来说,装饰器是一种强大而灵活的工具,可以帮助我们在不改变函数本身的情况下,为函数添加额外的功能。通过使用装饰器,我们可以轻松地实现一系列的功能,比如计时、缓存、权限验证、日志记录等等,从而提高代码的复用性和可维护性。
