首页 > 解决方案 > 蟒蛇 | 装饰器:多次调用函数

问题描述

Q.1 : 当第二次调用 display 时为什么 print('inside outer') 没有被调用或者为什么 inside external 不打印?

Q.2:我们只是提供了wrapper(函数名),并没有实际调用它,那么wrapper函数是怎么调用的,是不是装饰器功能在内部调用了函数呢?

代码:

def outer(func):
    def wrapper():
        print('inside wrapper func')
        func()
    print('inside outer')
    return wapper

@outer
def display():
    print('inside display')
    
display()
display()

Output: 

inside outer
inside wrapper func
inside display
inside wrapper func
inside display

标签: pythonpython-decorators

解决方案


在函数式编程中,您刚刚所做的称为副作用。函数旨在返回一个值,但您通过打印到控制台引入了副作用!

回答 Q1,外部函数只被调用一次,那是你立即执行@outer。即使你不调用显示,只是装饰它会打印'inside outer'。试试看!因此,当您调用 display 时,您正在调用包装函数。

回答 Q2,饼图语法 (@) 只是一种说法 display = outer(display) 现在它的作用是打印 'inside outer' 然后返回包装函数。因此,当您调用 display 时,您不是在调用外部函数,而是在调用包装器。display 现在就像 wrapper 的化名。


推荐阅读