1
def decorator(func):
   def wrapper(func):
     do something before
     func()
     do something later

   return wrapper

func = decorator(func) ----> 这是我的 decoarated 函数 func() 做装饰的东西并给我输出。

为什么不简单地装饰一下呢?

def decorator(func):

    do something before
    func()
    do something later

decorator(func)

我能看到的唯一优点是,在一种情况下,我获得了用于分配和重用的 func 对象。我想这个问题有点含糊,但我在想,如果我们的目的只是装饰,为什么我们需要返回一个函数对象?我的意思是有什么好处?

4

2 回答 2

3

如果您想在多个地方使用修饰函数,则必须返回一个函数对象以重复使用

在您的第二个示例中,调用decorator(func)calls func。这意味着如果你想要装饰器的行为(即“之前的东西”和“之后的东西”),你必须decorator(func)每次都调用。

装饰器的重点是您可以有效地执行func = decorator(func),然后,当您调用func它时,它会自动调用装饰器行为。

于 2013-02-27T07:38:44.017 回答
1

考虑装饰器语法的含义。这个:

@decorator
def say_hi():
    print "Hello!"

是语法糖:

def say_hi():
    print "Hello!"
say_hi = decorator(say_hi)

因此,装饰器基本上接受一个函数,并返回一个新的、修改后的函数。换句话说,在装饰之前,say_hi是一个功能;之后,它仍然是一个函数……尽管是一个修改过的函数。

如果装饰器是这样写的:

def decorator(fn):
  return "Something else"

然后,在装饰之前,say_hi它将是一个函数,但之后,它将具有值“Something else”(一个字符串)而不是 - 现在它不再是可调用的!

于 2013-02-27T07:40:42.123 回答