Why are decorators useful?
所以我读了这篇关于装饰师的文章,但我还是不明白什么时候装饰师有用。
考虑一段定义函数f的代码,然后多次调用它。出于某种原因,我们希望f做一些额外的工作。所以我们有两种方法:
定义一个新的函数g,它调用f,并执行所需的额外工作。然后在主代码中,用对g的调用替换对f的所有调用。
定义decorator g,并在调用f之前编辑代码以添加@g。
最后,他们都取得了相同的结果,我并不清楚2)比1)的优势。我错过了什么?
- 你需要它们的那一天就是你真正发现它有用的时候。
- 装饰师只是句法上的糖分。任何你想包装一个函数或将副作用附加到函数上的地方,装饰都是有用的。
- 我想你可以在这里找到很多好的反馈:stackoverflow.com/a/489754/463678
- 以@property装饰器为例,介绍一个标准的库装饰器。或者是@functools.total_ordering类装饰器。或者是@contextlib.contextmanager()装饰。
- 装饰师只是一种设计模式。获取更多信息:en.wikipedia.org/wiki/decorator_pattern
- 可能是Python装饰器的一些常见用途的副本?
- 有一件很重要的事情你错过了:如果你想用装饰器g包装一个函数f,你只需要在f的声明中添加@g一次*—而不是每次使用f时。因此,选项(2)将只涉及一次代码更改,而(1)可能意味着几十次。
- 它的语法结构使它更容易阅读和维护。用函数包装只是更混乱而已,这样您就可以更好地用一种适合意图的方式来编写它。所有面向对象的符号都是句法上的糖,我们发现它是有用的。
- 从技术上讲,您不需要Python,因为在Python之前就有语言可以完成Python所能做的一切。然而,一些人发现用Python编写可以更容易地完成他们的工作。decorator是相似的;当然您可以使用现有的工具(定义一个新的函数),但是decorator可能能够用开发更快或维护更容易的代码来解决完全相同的功能需求。
假设您有很多函数f1、f2、f3……你需要一个常规的方法来对所有人做同样的改变来做同样的额外工作。
这就是你所缺少的,也是为什么装饰师是有用的。也就是说,接受一个函数并返回它的修改版本的函数。
decorator @语法是为了方便而使用的"just"。它允许您按照定义来修饰函数:
1 2 3
| @decorated
def foo():
# several lines |
而不是函数定义之后的某个位置:
1 2 3 4
| def foo():
# several lines
foo = decorated(foo) |
事实上,后一种代码是相当可怕的,因为它意味着通过查看源代码中foo的第一个定义,您不会看到用户调用的同一个foo。因此,如果没有语法,装饰器就不会那么有价值了,因为您最终总是会为修饰和未修饰的函数使用不同的名称。