关于python:为什么装饰器有用?

Why are decorators useful?

所以我读了这篇关于装饰师的文章,但我还是不明白什么时候装饰师有用。

考虑一段定义函数f的代码,然后多次调用它。出于某种原因,我们希望f做一些额外的工作。所以我们有两种方法:

  • 定义一个新的函数g,它调用f,并执行所需的额外工作。然后在主代码中,用对g的调用替换对f的所有调用。
  • 定义decorator g,并在调用f之前编辑代码以添加@g
  • 最后,他们都取得了相同的结果,我并不清楚2)比1)的优势。我错过了什么?


    假设您有很多函数f1f2f3……你需要一个常规的方法来对所有人做同样的改变来做同样的额外工作。

    这就是你所缺少的,也是为什么装饰师是有用的。也就是说,接受一个函数并返回它的修改版本的函数。

    decorator @语法是为了方便而使用的"just"。它允许您按照定义来修饰函数:

    1
    2
    3
    @decorated
    def foo():
        # several lines

    而不是函数定义之后的某个位置:

    1
    2
    3
    4
    def foo():
        # several lines

    foo = decorated(foo)

    事实上,后一种代码是相当可怕的,因为它意味着通过查看源代码中foo的第一个定义,您不会看到用户调用的同一个foo。因此,如果没有语法,装饰器就不会那么有价值了,因为您最终总是会为修饰和未修饰的函数使用不同的名称。