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

Python2中的装饰器和函数修饰符

发布时间:2024-01-07 18:34:19

装饰器是Python中的一种特殊函数,它可以在不修改原函数的情况下,为函数添加额外的功能。装饰器通常用于对函数进行包装,以实现类似于AOP(面向切面编程)的效果。

在Python2中,装饰器的语法稍有不同,但原理相同。下面是一个简单的装饰器的例子:

def logger(func):
    def wrapper(*args, **kwargs):
        print("调用函数:{}".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper

@logger
def add(x, y):
    return x + y

result = add(3, 5)
print(result)  # 输出:调用函数:add 8

在上面的例子中,我们定义了一个logger装饰器。装饰器接收一个函数作为参数,然后定义一个内部函数wrapper,在调用被装饰的函数之前打印一条日志。最后,装饰器返回内部函数wrapper

使用装饰器语法@logger,我们将logger装饰器应用到了add函数上。当我们调用add函数时,实际上是调用了被装饰后的函数wrapper,并且在调用前会打印一条日志。最终输出的结果是调用函数名和函数的返回值。

装饰器还可以带有参数,如下所示的例子:

def retry(max_retries):
    def decorator(func):
        def wrapper(*args, **kwargs):
            retries = 0
            while retries < max_retries:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print("函数调用出现异常:{}".format(str(e)))
                    retries += 1
            raise Exception("函数调用失败")
        return wrapper
    return decorator

@retry(3)
def fetch_data(url):
    response = requests.get(url)
    return response.json()

url = "https://api.example.com/data"
data = fetch_data(url)

在上面的例子中,我们定义了一个retry装饰器,它带有一个参数max_retries。装饰器的内部定义了一个decorator函数,它接收一个被装饰的函数作为参数,并返回一个内部函数wrapperwrapper函数在调用被装饰的函数时,会尝试最多max_retries次,并在每次失败后打印一条日志,最终抛出异常。

通过使用装饰器语法@retry(3),我们将retry装饰器应用到了fetch_data函数上,并指定了max_retries参数为3。当我们调用fetch_data函数时,如果发生异常,装饰器会自动进行最多3次的重试。

总结起来,装饰器是一种非常强大的工具,可以用于在不修改原函数的情况下为其添加额外的功能。在Python2中,我们可以使用装饰器来实现函数的修饰,这可以使代码更加简洁和可读。