Python |装饰器:多次调用函数

时间:2020-08-29 09:24:55

标签: python python-decorators

Q.1:第二次调用display时,为什么不调用print('inside external')或为什么不进行内层外部打印?

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

代码:

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

2 个答案:

答案 0 :(得分:0)

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

在回答Q1时,外部函数仅被调用一次,您立即执行@outer。即使您不调用显示,仅对其进行装饰也将在内部打印。试试看!因此,在调用display时,就是在调用包装函数。

回答第二季度,饼图语法(@)仅表示display = external(display) 现在,它的作用是打印“ inside external”,然后返回包装函数。因此,当您调用display时,您没有在调用包装器的外部函数。现在显示就像是包装器的笔名。

答案 1 :(得分:-1)

第二季度

仅提供包装器(函数名称)而不实际调用它,然后包装器函数如何调用

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


第一季度

在装饰器定义中,我们只需调用一个命令即可使装饰器正常工作

返回包装器

需要两个命令时

print('inside external') 返回包装器

我的最佳猜测是包装器定义方法仅加载一次,并且第二次仅重用之前加载的已编译代码