包装器方法的意义是什么?

时间:2013-02-27 07:35:30

标签: python decorator

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

   return wrapper

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

为什么不简单地装饰它?

def decorator(func):

    do something before
    func()
    do something later

decorator(func)

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

2 个答案:

答案 0 :(得分:3)

如果你想在多个地方使用修饰函数,你返回一个要重复使用的函数对象。

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

装饰者的观点是你有效地做func = decorator(func)然后,永远之后,当你调用func时,它会自动调用装饰者的行为。

答案 1 :(得分: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”(字符串) - 现在它不再可调用了!