Python | Decorators:多次调用函数

Python | Decorators:多次调用函数,python,python-decorators,Python,Python Decorators,问题1:第二次调用display时,为什么不调用print“inside-outer”或inside-outer不打印 Q.2:我们只是提供包装器函数名,而不是实际调用它,那么包装器函数是如何调用的,它是不是在返回时在内部调用该函数的装饰器功能 代码: 第二季度 只是提供包装器函数名而不是实际调用它,那么包装器函数如何调用它呢 这就是python装饰器的工作原理 在第一季度 在decorator定义中,我们只需调用一个命令即可使decorator工作 返回包装器 当您需要两个命令时 打印“内-外

问题1:第二次调用display时,为什么不调用print“inside-outer”或inside-outer不打印

Q.2:我们只是提供包装器函数名,而不是实际调用它,那么包装器函数是如何调用的,它是不是在返回时在内部调用该函数的装饰器功能

代码:

第二季度

只是提供包装器函数名而不是实际调用它,那么包装器函数如何调用它呢

这就是python装饰器的工作原理

在第一季度

在decorator定义中,我们只需调用一个命令即可使decorator工作

返回包装器

当您需要两个命令时

打印“内-外” 回程挡板


我最好的猜测是包装器定义方法只加载一次,第二次,它只是在函数编程中重用以前加载的编译代码,您刚才所做的就是所谓的副作用。函数的作用是返回一个值,但您通过打印到控制台引入了一个副作用

回答Q1时,外部函数只被调用一次,您立即执行@outer。即使您不调用display,只要对其进行装饰,也会打印“内-外”。试试看!因此,当您调用display时,您正在调用包装器函数

回答问题2时,饼图语法@只是表示display=outerdisplay的一种方式
现在它要做的是打印“inside-outer”,然后返回包装器函数。因此,当您调用display时,您调用的不是外部函数而是包装器。显示现在就像包装器的笔名。

1。因为outer本身只被调用一次,在那之后,它是包装器,然后调用原始显示。2.是的,@只是display=outerdisplay的语法糖。好的,非常感谢您的快速响应jonrsharpe@.
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