一般情况下
如果不用decorator,也可以这样表达
subject_matter_function = outer_decorator(inner_decorator(subject_matter_function())))
abcd = subject_matter_function()
所以问题下方代码注释里
```python
def big_container(collective_material):
def wrapper(our_function):
def internal_wrapper(*args):
our_function(*args)
print('<strong>*</strong> The whole order would be from {} packed with {}'.format(our_function.__name__, collective_material)) #这里的our_function.__name__为什么不显示warehouse_decorator,而显示 internal_wrapper,能否解释一下
print()
return internal_wrapper
return wrapper
def warehouse_decorator(material):
def wrapper(our_function):
def internal_wrapper(*args):
our_function(*args)
print('<strong>*</strong> Wrapping items from {} with {}'.format(our_function.__name__, material))
#这里的our_function.__name__就显示pac_books
return internal_wrapper
return wrapper
@big_container('plain cardboard')
@warehouse_decorator('bubble foil')
def pack_books(*args):
print("We'll pack books:", args)
pack_books('Alice in Wonderland', 'Winnie the Pooh')
```
多个装饰器的装饰过程是: 离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程,big_container的装饰实际是对warehouse_decorator返回函数的装饰
一个函数只能有一个装饰器
你在pack_books前面加了2个艾特
只有warehouse_decorator才是它的装饰器(距离近的一个)
big_container就是个普通的函数调用