2013-02-27 83 views
1
def decorator(func): 
    def wrapper(func): 
    do something before 
    func() 
    do something later 

    return wrapper 

func =装饰(func)---->这是我的装饰功能 func()做装饰的东西,并给我输出。包装方法的意义是什么?

为什么不简单地装饰它?

def decorator(func): 

    do something before 
    func() 
    do something later 

decorator(func) 

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

+0

“只是装饰”对你意味着什么? – BrenBarn 2013-02-27 07:39:07

+0

这个问题也与Python中的函数和变量是如何相关的。通过装饰,我的意思是在前后做一些事情。 – Nishant 2013-02-28 21:08:24

回答

3

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

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

装饰者的要点是,你实际上做了func = decorator(func),然后永远在你调用func之后,它会自动调用装饰器行为。

+0

完美,重用就是这个词。将它放在作为命名对象的范围内 - 以便我可以重新使用。 – Nishant 2013-02-27 07:39:59

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将是一个功能,但事后,那就得值“别的东西”(字符串),而不是 - 和现在它不再可调用!

+0

正确的话,你可以说,如果你正在返回一个魔法的指示,没有涉及执行。在另一个你正在返回计算结果。 – Nishant 2013-02-28 21:21:24

相关问题