我正在和装饰者打交道。按照理论,它们是自下而上应用的,也就是说,最接近被装饰函数的描述的是第一个。然而,代码
'''case 1'''
import functools
def bold(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return '<b>' + func(*args, **kwargs) + '</b>'
return wrapper
def italic(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return '<i>' + func(*args, **kwargs) + '</i>'
return wrapper
strng = '1123123123'
@bold
@italic
def greet(string):
return string
print(greet(strng))
"""Case 2:"""
def dec1(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f'Первый декоратор')
value = func(*args, **kwargs)
return value
return wrapper
def dec2(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f'Второй декоратор')
value = func(*args, **kwargs)
return value
return wrapper
@dec1
@dec2
def function(string):
return string
print(function('fdsfsdf'))
给我结果
<b><i>Hello world!</i></b>
第一个装饰器
第二个装饰器
fdsfsdf
问题是为什么在第一种情况下装饰器像理论上一样使用,首先是斜体,然后是粗体,从下到上。在第二种情况下,首先是 dec1,它在顶部,然后是 dec2,它在下面?我不明白装饰器和函数的描述有何不同,不同行为的原因是什么?