欢迎访问宙启技术站
智能推送

装饰器:提升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程序的质量。