【问题标题】:What is the intended lifetime of a Python decorator?Python 装饰器的预期生命周期是多少?
【发布时间】:2017-03-31 16:22:33
【问题描述】:

我的问题围绕已实现的 Python 装饰器的预期生命周期展开。来自realpython.org 它说:

''根据定义,装饰器是一个接受另一个函数的函数 并在没有显式的情况下扩展后一个函数的行为 修改它。''

在我看来,在线示例中似乎经常使用装饰器来临时修改或扩展 python 函数,例如在 html 格式化示例中。

示例

假设我在一家网络开发公司工作,在我所有网页的顶部,我将这个 Python 函数称为 page_welcome()

def page_welcome():
    return "Welcome to XYZ's company webpage!"

现在,一些开发人员加入了公司,并决定我们应该通过修改一些 bolditalics 的功能来使其更加突出。

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped    

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped    

@makebold
@makeitalic
def page_welcome():
    return "Welcome to XYZ's company webpage!"

如果我们决定这个改变是永久性的,那么装饰器是离开这个永久性修改的最好方法吗?

注意:上面的示例是来自此链接的装饰器示例(稍作修改): How to make a chain of function decorators?

【问题讨论】:

  • 为什么你认为它们是临时的?您是否看到任何以某种方式删除它们的示例?你可以在函数中加上粗体和斜体,但它有多个问题和有限的重用性。
  • 装饰器不是临时的。您通常会定义一个装饰器并将其应用于许多函数,因此它们是一种使代码更干燥(即重复次数更少)的方法。例如,在像 Django 这样的框架中,你有一个像 login_require 这样的装饰器,你可以将它附加到表示只有登录用户才能看到的网页的函数上,并且装饰器使得未登录的人首先被重定向到登录页面。如果不使用装饰器,您必须在所有这些函数的开头放置几行来手动检查用户并重定向他......
  • 我不明白你的目的。如果您决定永久更改字符串,为什么不直接硬编码到您的字符串中?
  • @all,我没有看到它们被删除的任何示例,但这就是某些示例似乎脱落的方式。我想语法糖虽然有助于 DRY 哲学,但乍一看对我来说似乎很脆弱。也就是说,删除行为就像添加行为一样容易,对于没有经验的人来说,这似乎很容易意外发生。

标签: python decorator python-decorators


【解决方案1】:

装饰器的主要目的不是临时修改函数行为。 “暂时”这个词在这里很奇怪。最好将它们视为职责分解和代码重用。它们主要用于添加一些不唯一绑定到装饰功能的行为,也可以用于其他功能。一个很好的例子是@memoized 装饰器,它记住被装饰函数计算的值(这可能需要很长时间来计算)并在下一次立即返回该值。这样的装饰器可以多次重用,除此之外,它使核心更具可读性:与其用记忆代码使​​函数膨胀,不如添加一行清楚地说明实际发生的情况。

【讨论】:

  • 回到这个问题,自从我发布这个之后学到了很多东西,最好编辑这个答案,包括一个关于装饰器本身是一种设计模式的注释,而不是仅限于 Python。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2021-09-25
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多