【问题标题】:How can i write a decorator using a class's __call__ function?如何使用类的 __call__ 函数编写装饰器?
【发布时间】:2015-03-24 13:58:19
【问题描述】:

以下是我的代码。给定任何内容,它必须将某些 HTML 标记附加到前面的内容中。 我正在学习使用 call 而不是函数闭包来编写装饰器。

class decorate:
    def __init__(self, tag=""):
        self.tag = tag
    def __call__(self, function, *args):
        return "<p>{}</p>".format(self.tag, function(*args), self.tag)

@decorate(tag="p")
def get_content(content):
    return content    

print(get_content("I'm awesome"))

# Error i got.
Traceback (most recent call last):
  File "cache.py", line 27, in <module>
    @decorate(tag="p")
  File "cache.py", line 25, in __call__
    return "<p>{}</p>".format(self.tag, function(*args), self.tag)
TypeError: get_content() takes exactly 1 argument (0 given)

【问题讨论】:

    标签: python django decorator python-decorators


    【解决方案1】:

    变化:

    def __call__(self, function, *args):
        return "<p>{}</p>".format(self.tag, function(*args), self.tag)
    

    进入:

    def __call__(self, function):
       def wrap(*args):
           return "<{}>{}</{}>".format(self.tag, function(*args), self.tag)
       return wrap
    

    您可能想查看functools 以获得更精致的wrap 装饰,但除了支持help 等之外,这应该可以工作。

    【讨论】:

    • 是的。这行得通。但是现在我正在尝试使用装饰器来实现缓存,并且遇到了类似的错误。代码:ideone.com/kUu9XH
    • @user1159517,按照 StackOverlow 的礼仪,请将其作为一个单独的问题发布,包括给您带来问题的代码(不欢迎链接到该代码的异地位置),正是您所期望的,正是您观察到的,等等。
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 2021-01-28
    • 2014-09-20
    • 2015-01-03
    • 2012-10-28
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多