【问题标题】:Why are decorators useful? [closed]为什么装饰器有用? [关闭]
【发布时间】:2014-04-09 05:34:24
【问题描述】:

所以我读了这篇关于装饰器的page,但我仍然不明白什么时候装饰器有用。

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

  1. 定义一个新函数g,它调用f,并完成所需的额外工作。然后在主代码中,将所有对f的调用替换为对g的调用
  2. 定义一个装饰器g,并编辑代码在调用f之前添加@g

最后,它们都达到了相同的结果,并且 2) 相对于 1) 的优势对我来说并不明显。我错过了什么?

【问题讨论】:

标签: python python-decorators


【解决方案1】:

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

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

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

@decorated
def foo():
    # several lines

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

def foo():
    # several lines

foo = decorated(foo)

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

【讨论】:

  • 这和调用 decorated() 作为函数有什么区别? (当然除了注释)
猜你喜欢
  • 2010-10-03
  • 2019-03-24
  • 2021-05-10
  • 2012-03-22
  • 2010-09-17
  • 2012-01-09
  • 2016-10-30
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多