使用装饰器和显式调用它有什么区别?

时间:2012-01-07 20:09:10

标签: python decorator

我们假设我们有一个装饰者:

def decor(function):
    def result():
        printf('decorated')
        return function()
    return result

以下代码之间有什么区别:

@decor
def my_foo():
    print('my_foo')

def my_foo():
    print('my_foo')
my_foo = decor(my_foo)

3 个答案:

答案 0 :(得分:7)

您的上一个代码段几乎是装饰器的定义。唯一的区别是,在第一种情况下,在函数定义之前评估名称decor,而在第二种情况下,在函数定义之后评估名称def decor(function): def result(): printf('decorated') return function() return result def plonk(): global decor decor = lambda x: x return None 。这只会在执行函数定义更改名称引用的内容时产生影响。

荒谬的例子:

@decor
def my_foo(foo=plonk()):
    print('my_foo')

现在

def my_foo(foo=plonk()):
    print('my_foo')
my_foo = decor(my_foo)

不同
{{1}}

答案 1 :(得分:4)

没有区别。 @decorator语法只是让您更容易理解正在应用装饰器。 (这是syntactic sugar的示例。)

答案 2 :(得分:1)

如果存在差异,那么Python 2.4之前的python版本是否不支持@decorator语法,而自石器时代起支持显式装饰器调用。此外,必须在函数定义中应用@decorator语法,并且必须使用相同的函数名称,而稍后可以应用显式装饰器调用,并且可以重命名装饰函数。

使用@decorator语法,除非你有真的,真的,真的好理由不这样做;这几乎从来没有。