装饰器:提升Python函数的灵活性
发布时间:2023-06-16 13:57:34
装饰器是Python语言中的一种高级功能,它允许你在不修改现有函数代码的情况下,对函数进行功能增强。装饰器可以用来给函数动态添加功能,比如缓存、日志记录、性能分析、重试机制等。在Python中,函数就是一等公民,可以像任何其他对象一样被传递和操作,因此装饰器可以被用于各种场景。使用装饰器可以提高代码的灵活性和可重用性,使代码更优美和易于维护。
用装饰器实现缓存功能
当我们执行某个函数时,有时候会需要缓存函数的执行结果以提高程序的性能。有了装饰器,我们可以轻松地实现这个功能,代码如下:
def cache(func):
cache_dict = {}
def wrapper(*args):
if args in cache_dict:
print("from cache")
return cache_dict[args]
else:
result = func(*args)
cache_dict[args] = result
return result
return wrapper
@cache
def fib(n):
if n < 2:
return n
else:
return fib(n-1) + fib(n-2)
print(fib(10)) # 第一次执行需要计算,输出结果为:55
print(fib(10)) # 第二次执行从缓存中获取结果,输出结果为:55
用装饰器实现重试机制
有时候我们在执行某个函数时可能会遇到网络等异常,而这些异常往往只是暂时的,此时我们可以通过重试机制来解决问题。有了装饰器,我们可以轻松地给函数添加重试功能,代码如下:
import time
def retry(max_retry=3, delay=1):
def wrapper(func):
def inner(*args, **kwargs):
retry_times = 0
while retry_times < max_retry:
try:
result = func(*args, **kwargs)
return result
except Exception as e:
retry_times += 1
print(f"Exception caught. Retry in {delay} seconds.\
Error message: {str(e)}")
time.sleep(delay)
raise Exception(f"Retry {max_retry} times, still failed!")
return inner
return wrapper
@retry(max_retry=3, delay=1)
def some_func():
"""待重试的函数"""
pass
用装饰器实现权限控制
有时候我们在执行某个函数时,需要对用户进行权限验证。有了装饰器,我们可以轻松地实现这个功能,代码如下:
def check_permission(func):
def wrapper(*args, **kwargs):
if check_user_permission():
result = func(*args, **kwargs)
return result
else:
raise Exception("You don't have permission to access.")
return wrapper
@check_permission
def some_func():
"""需要进行权限控制的函数"""
pass
装饰器可以提升Python函数的灵活性,使其可以加入各种功能,同时使代码更优美和易于维护,是Python语言优秀的设计特性之一。对于初学者来说,常用的装饰器有 @staticmethod、@classmethod和@property等,熟练使用装饰器,有助于提升Python程序的质量。
