为啥装饰器有用? [关闭]

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】:

假设您有很多函数 f1f2f3,...,并且您希望以常规方式对所有函数进行相同的更改以完成相同的额外工作。

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

为了方便起见,装饰器@ 的语法是“just”。它可以让您按照定义的方式装饰函数:

@decorated
def foo():
    # several lines

而不是函数定义之后的某处:

def foo():
    # several lines

foo = decorated(foo)

事实上,后面的代码当然很糟糕,因为这意味着通过查看源代码中foo 的第一个定义,您不会看到用户调用的foo。因此,如果没有语法,装饰器就不会那么有价值,因为您几乎总是会为装饰和未装饰的函数使用不同的名称。

【讨论】:

这和调用 decorated() 作为函数有什么区别? (当然除了注释)

以上是关于为啥装饰器有用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python - 所有内置装饰器是啥? [关闭]

装饰器模式:为啥我们需要抽象装饰器? [复制]

python装饰器内获取函数有用信息方法

带参数的装饰器,多个装饰器装饰一个函数,函数的有用信息。

为啥我们需要装饰器设计模式中的装饰器?

Python全栈__函数的有用信息带参数的装饰器多个装饰器装饰一个函数