繁体   English   中英

如何使用类的__call__函数编写装饰器?

[英]How can i write a decorator using a class's __call__ function?

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

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)

更改:

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之类的东西外,这应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM