【问题标题】:Discard the decorator [duplicate]丢弃装饰器[重复]
【发布时间】:2017-06-06 06:43:42
【问题描述】:

您能否帮助我了解是否可以使用带有装饰器和不带装饰器的函数。

例子:

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

@makeitalic
def hello():
    return "hello, sir or madam!"

我想到的唯一方法:

def hello():
    return "hello, sir or madam!"

@makeitalic
def italic_hello():
    return(hello())

那么,没有装饰器可以使用 hello() 吗?

【问题讨论】:

  • 请注意,italic_hello = makeitalic(hello) 会更简单——这基本上就是 @makeitalic 的语法糖所做的。
  • 您可以将实际函数作为属性分配给wrapped
  • 如果您需要这种动态行为,请不要使用装饰器。
  • 我将对此进行一些扩展,因为我认为这个骗子解决了细节问题,而不是更大的图景。装饰器的目的是表达一个“静态”的源级组合。如果您想到的是某种运行时、可以完成、撤消、修改等的动态组合,那么装饰器不是您想要的。

标签: python


【解决方案1】:

一般不会。装饰函数 替换 原始函数,因此除非装饰器本身明确使其可用(例如,通过将其存储在某个全局注册表中或作为某个对象的属性),否则无法获取原始函数。 (您可以在修饰函数的闭包对象中将其作为单元变量进行访问,但这不是很健壮,除了测试和试验外不应依赖它。)

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 2019-09-01
    • 2012-02-09
    • 2023-03-28
    • 2012-04-28
    • 2012-07-15
    • 2023-03-26
    • 2021-11-20
    相关资源
    最近更新 更多