【发布时间】:2016-07-25 10:53:35
【问题描述】:
我从thecodeship 上的一篇很棒的教程中学到了一些关于装饰器的知识,但发现自己被一个例子弄糊涂了。
首先给出一个简单的例子,然后解释什么是装饰器。
def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
return func_wrapper
def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)
my_get_text = p_decorate(get_text)
print my_get_text("John")
现在这对我来说很有意义。装饰器只是函数的包装器。在这个家伙的解释中,他说装饰器是一个函数,它接受另一个函数作为参数,生成一个新函数,然后返回生成的函数以在任何地方使用。
现在等价于上面的代码是:
def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
return func_wrapper
@p_decorate
def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)
print get_text("John")
我相信我理解在没有参数时初始化装饰器的方式。如果我错了,请纠正我。
- 装饰器默认传入函数
get_text,因为p_decorate返回函数func_wrapper,我们最终得到了正确的声明get_text = func_wrapper。
对我来说重要的是第一个代码块等价物,因为我看到并理解装饰器的行为方式。
让我非常困惑的是以下代码:
def tags(tag_name):
def tags_decorator(func):
def func_wrapper(name):
return "<{0}>{1}</{0}>".format(tag_name, func(name))
return func_wrapper
return tags_decorator
@tags("p")
def get_text(name):
return "Hello "+name
print get_text("John")
再次,如果我错了,请纠正我,但这是我的理解。
- 装饰器接受标签字符串“p”而不是
默认函数名。反过来函数
tags_decorator假设将要传入的参数是函数 正在装修,get_text。
以“非装饰器”形式查看等效的代码块可能对我有所帮助,但我似乎无法理解它的外观。我也不明白为什么tags_decorator 和func_wrapper 都被返回了。如果装饰器只需要返回1个函数来包装get_text,那么返回两个不同函数的目的是什么。
顺便说一句,实际上归结为以下几点。
- 能否将此块简化为少于 3 个函数的集合?
- 装饰器可以接受多个参数来简化代码吗?
【问题讨论】:
标签: python decorator python-decorators