为啥装饰器有用? [关闭]
Posted
技术标签:
【中文标题】为啥装饰器有用? [关闭]【英文标题】:Why are decorators useful? [closed]为什么装饰器有用? [关闭] 【发布时间】:2014-04-09 05:34:24 【问题描述】:所以我读了这篇关于装饰器的page,但我仍然不明白什么时候装饰器有用。
考虑一段代码定义一个函数f
,然后多次调用它。出于某种原因,我们希望f
做一些额外的工作。所以我们有两种方法:
-
定义一个新函数
g
,它调用f
,并完成所需的额外工作。然后在主代码中,将所有对f
的调用替换为对g
的调用
定义一个装饰器g
,并编辑代码在调用f
之前添加@g
最后,它们都达到了相同的结果,并且 2) 相对于 1) 的优势对我来说并不明显。我错过了什么?
【问题讨论】:
您需要它们的那一天是您真正发现它的用处的时候。 装饰器只是语法糖。任何你想包装函数或给函数附加副作用的地方,装饰器都很有用。 你可以在这里找到很多好的反馈我认为:***.com/a/489754/463678 查看@property
decorator 以获得标准库装饰器的示例。或@functools.total_ordering
class decorator。或@contextlib.contextmanager()
decorator。
What are some common uses for Python decorators?的可能重复
【参考方案1】:
假设您有很多函数 f1
、f2
、f3
,...,并且您希望以常规方式对所有函数进行相同的更改以完成相同的额外工作。
这就是你所缺少的,这就是装饰器有用的原因。也就是说,函数接受一个函数并返回它的修改版本。
为了方便起见,装饰器@
的语法是“just”。它可以让您按照定义的方式装饰函数:
@decorated
def foo():
# several lines
而不是函数定义之后的某处:
def foo():
# several lines
foo = decorated(foo)
事实上,后面的代码当然很糟糕,因为这意味着通过查看源代码中foo
的第一个定义,您不会看到用户调用的foo
。因此,如果没有语法,装饰器就不会那么有价值,因为您几乎总是会为装饰和未装饰的函数使用不同的名称。
【讨论】:
这和调用 decorated() 作为函数有什么区别? (当然除了注释)以上是关于为啥装饰器有用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章