我有这个简单的代码。
def decor(func):
def wrap():
print("============")
func()
print("============")
return wrap
def print_text():
print("Hello world!")
decor(print_text())
为什么这只打印" Hello world!"而不是两个包装?
答案 0 :(得分:0)
在这里,您正在评估print_text
(因此打印" Hello World!"),并将结果传递给decor
:
decor(print_text())
这里我们将print_text
传递给decor
,并调用它返回的结果函数,即wrap
::
decor(print_text)()
请注意,第一种情况不会调用从decor
返回的函数。尝试调用它,看看会发生什么:
decor(print_text())()
TypeError:' NoneType'对象不可调用
因为func
现在是None
。
答案 1 :(得分:0)
那是因为你只返回了函数换行 - 它没有被调用。如果您通过将结果分配给变量或直接使用decor(print_text)()
来调用它。请注意,您应该使用print_text
而不是print_text()
,因为后者会将函数的结果赋予装饰,而不是函数本身。工作版本将是:
def decor(func):
def wrap():
print("============")
func()
print("============")
return wrap
def print_text():
print "Hello world!"
wrapped_function = decor(print_text)
wrapped_function()
答案 2 :(得分:0)
您使用单个参数调用decor
。该论点是print_text()
返回的任何内容。好吧,print_text()
打印一些内容然后返回None。到目前为止,您的输出只是Hello world!
。现在没有传递给decor
,它返回wrap()
函数。实际上wrap()
实际上没有被调用,你的最终输出只是Hello world!
。
你误解了装饰器的使用。正确的语法是:
@decor
def print_text():
print("Hello world!")
这是一个捷径:
def print_text():
print("Hello world!")
print_text = decor(print_text)
现在您可以看到正在调用decor(print_text)
(wrap()
函数)的返回值,并打印所有内容。