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函数,它接收一个被装饰的函数作为参数,并返回一个内部函数wrapper。wrapper函数在调用被装饰的函数时,会尝试最多max_retries次,并在每次失败后打印一条日志,最终抛出异常。
通过使用装饰器语法@retry(3),我们将retry装饰器应用到了fetch_data函数上,并指定了max_retries参数为3。当我们调用fetch_data函数时,如果发生异常,装饰器会自动进行最多3次的重试。
总结起来,装饰器是一种非常强大的工具,可以用于在不修改原函数的情况下为其添加额外的功能。在Python2中,我们可以使用装饰器来实现函数的修饰,这可以使代码更加简洁和可读。
