我如何使用 class 的 __call__ 函数编写装饰器?
How can i write a decorator using a class's __call__ function?
以下是我的代码。给定任何内容,它必须在前面的内容上附加一定的 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)
变化:
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
之类的之外,这应该可以。
以下是我的代码。给定任何内容,它必须在前面的内容上附加一定的 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)
变化:
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
之类的之外,这应该可以。