不执行任何操作的简单装饰器,如下所示:
def decorator(func):
return func # don't need to call!
@decorator
def print_word(word='python'):
print (word)
那会很好的运行
>>> print_word()
python
但是,如果我将其包装在一个内部函数中,它会像这样被调用:
def decorator(func):
def _func(*args, **kwargs):
print ("Args: %s | Kwargs: %s" % (args, kwargs))
return func(*args, **kwargs) # <== Here I need to "call" it with ()
return _func
@decorator
def print_word(word='python'):
print (word)
>>> print_word('ok')
Args: ('ok',) | Kwargs: {}
ok
为什么这两种方法有什么不同?如何调用_func
“绑定”到_func(*args, **kwargs)
?
答案 0 :(得分:0)
def decorator(func):
因为它是一个装饰器,所以我们希望它返回可以被调用的东西。
return func # don't need to call!
是的,因为func
是我们将返回的“可以调用的东西”。装饰器无效。
然后,如果我将其包装在一个内部函数中,它被称为like
我们对_func
所做的工作是创建装饰器将返回的 new 函数,并根据传递的 定义其行为。在func
中。因此,在调用装饰器时,我们不会调用func
;但我们确实将其称为_func
的正文,因为这是使func
执行时_func
执行的方式。。
为什么这两种方法不同?
我不明白这个问题。它们有什么相同之处?他们俩都定义了一个装饰器,好的。他们以完全不同的方式来做。
如何调用
_func
“绑定”
我不明白您对此处进行绑定的意思,并且在此代码中没有直接按名称调用_func
。调用print_word
时会调用它,因为装饰器已将print_word
替换为本地创建的_func
。 (每次使用装饰器时,都会创建一个具有相同_func
名称的单独函数。这就是您绊脚石吗?)