python - 蟒蛇 | 装饰器:多次调用函数
问题描述
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
解决方案
在函数式编程中,您刚刚所做的称为副作用。函数旨在返回一个值,但您通过打印到控制台引入了副作用!
回答 Q1,外部函数只被调用一次,那是你立即执行@outer。即使你不调用显示,只是装饰它会打印'inside outer'。试试看!因此,当您调用 display 时,您正在调用包装函数。
回答 Q2,饼图语法 (@) 只是一种说法 display = outer(display) 现在它的作用是打印 'inside outer' 然后返回包装函数。因此,当您调用 display 时,您不是在调用外部函数,而是在调用包装器。display 现在就像 wrapper 的化名。
推荐阅读
- python - sqlite3.OperationalError:靠近“?”:循环通过 pragma table_info 时出现语法错误
- c# - WPF交互触发鼠标滚轮不起作用
- vagrant - 无法创建仅主机适配器
- python - imshow 不显示从 ndarray 提取的图像。没有错误
- python - Python - 导入 fastai 导致 SyntaxError
- java - Maven 原型:org.apache.maven.plugins:maven-surefire-plugin:2.20.1:test failed.: NullPointerException
- python - 如何在 Watson Studio 的 WML 存储库中保存 keras 模型?
- javascript - 使用 SOAP npm 库时为嵌套的 xml 赋值
- python - 关于python的继承、导入的一些问题
- mysql - 在一列中选择具有相似值的行