【发布时间】:2017-03-31 16:22:33
【问题描述】:
我的问题围绕已实现的 Python 装饰器的预期生命周期展开。来自realpython.org 它说:
''根据定义,装饰器是一个接受另一个函数的函数 并在没有显式的情况下扩展后一个函数的行为 修改它。''
在我看来,在线示例中似乎经常使用装饰器来临时修改或扩展 python 函数,例如在 html 格式化示例中。
示例:
假设我在一家网络开发公司工作,在我所有网页的顶部,我将这个 Python 函数称为 page_welcome()。
def page_welcome():
return "Welcome to XYZ's company webpage!"
现在,一些开发人员加入了公司,并决定我们应该通过修改一些 bold 和 italics 的功能来使其更加突出。
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