【问题标题】:What is the significance of the wrapper method?包装器方法的意义是什么?
【发布时间】:2013-02-27 07:35:29
【问题描述】:
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 对象。我想这个问题有点含糊,但我在想如果我们的目的只是装饰,为什么我们需要返回一个函数对象?我的意思是有什么好处?

【问题讨论】:

  • “只是装饰”对你意味着什么?
  • 这个问题也与 Python 中函数和变量的方式密切相关。装饰我的意思是在之前和之后做一些事情。

标签: python decorator


【解决方案1】:

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

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

装饰器的意义在于您有效地执行func = decorator(func),然后,当您调用func 时,它会自动调用装饰器行为。

【讨论】:

  • 完美,重用就是这个词。将其作为命名对象放在范围内 - 以便我可以重用。
【解决方案2】:

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

@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”(一个字符串)——现在它不再是可调用的!

【讨论】:

  • 是的,你可以这么说,以防你返回一组魔法指令而不涉及执行。在另一个你正在返回计算结果。
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多