Python装饰器的常见用途与实例分析
发布时间:2024-01-07 06:47:43
Python装饰器是一种在运行时动态增加函数功能的方法。它可以在不改变函数本身的代码的情况下,为函数或类添加额外的功能。
装饰器的常见用途如下:
1. 记录日志:装饰器可以用来记录函数的调用日志,可以记录函数的参数、返回值、执行时间等信息,方便在程序运行过程中进行调试和排查问题。
下面是一个记录函数执行日志的装饰器的使用例子:
def log(func):
def wrapper(*args, **kwargs):
print(f"Call {func.__name__} with args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@log
def add(a, b):
return a + b
result = add(1, 2)
在上面的例子中,log装饰器会打印出add函数的调用日志,并在函数执行完后打印返回值。
2. 访问控制:装饰器可以用来限制函数的访问权限,只有满足特定条件的用户或角色才能调用被装饰的函数。
下面是一个访问控制的装饰器的使用例子:
def access_control(func):
def wrapper(user, *args, **kwargs):
if user == "admin":
return func(user, *args, **kwargs)
else:
raise Exception("Access denied")
return wrapper
@access_control
def delete_file(user, file_name):
print(f"Deleting file {file_name} as {user}")
delete_file("admin", "test.txt")
在上面的例子中,access_control装饰器限制了只有user参数为"admin"的用户才能调用delete_file函数。
3. 时间测量:装饰器可以用来测量函数的执行时间,方便分析和优化程序的性能。
下面是一个测量函数执行时间的装饰器的使用例子:
import time
def measure_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds to run")
return result
return wrapper
@measure_time
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
result = fibonacci(10)
在上面的例子中,measure_time装饰器会测量fibonacci函数的执行时间,并打印出来。
4. 缓存结果:装饰器可以用来缓存函数的结果,以避免重复计算,提高程序的运行效率。
下面是一个缓存函数结果的装饰器的使用例子:
def cache_result(func):
cache = {}
def wrapper(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
@cache_result
def factorial(n):
if n <= 1:
return 1
else:
return n * factorial(n-1)
result = factorial(10)
在上面的例子中,cache_result装饰器会缓存factorial函数的结果,避免重复计算。
以上是Python装饰器的常见用途与相关实例的分析。装饰器是Python语言的一项强大特性,可以大大提高代码的复用性和可维护性。通过运用装饰器,我们可以轻松地为函数添加统一的功能,而无需修改函数的实现代码。
