所以我读了这个关于装饰者的page,但是当>>装饰器很有用时,我仍然不明白。
考虑定义函数f
的一段代码,然后多次调用它。出于某种原因,我们希望f
做一些额外的工作。所以我们有两种方法可以做到:
g
的新函数f
,并完成所需的额外工作。然后在主代码中,通过调用f
g
的调用
g
,并在调用@g
之前编辑代码以添加f
最后,他们都取得了相同的结果,2)超过1)的优势对我来说并不明显。我错过了什么?
答案 0 :(得分:1)
假设您有很多函数f1
,f2
,f3
,...并且您希望定期对所有函数进行相同更改以执行相同操作额外的工作。
这就是你所缺少的,这也是装饰师有用的原因。也就是说,函数接受一个函数并返回它的修改版本。
为方便起见,装饰器@
语法“只是”。它允许您按照定义来修饰函数:
@decorated
def foo():
# several lines
而不是函数定义之后的某个地方:
def foo():
# several lines
foo = decorated(foo)
事实上,后一个代码当然非常糟糕,因为这意味着通过查看源代码中foo
的第一个定义,您看不到用户将调用的相同foo
。因此,如果没有语法,装饰器就不会那么有价值,因为你几乎总是会为装饰和未装饰的函数使用不同的名称。