参考博客链接
装饰器可以对已经存在的函数进行封装。
def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)
def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
return func_wrapper
my_get_text = p_decorate(get_text)
print my_get_text("John")
# <p>Outputs lorem ipsum, John dolor sit amet</p>
在上面的方面中,我们并没有改变get_text
本身的内容,只是在其
外部封装了一个func_wrapper
函数,同时在func_wrapper
外部添加一个装饰器p_decorator
。
在装饰器里面,有一个func_wrapper,我不是很清楚func_wrapper的机制,但是如果没有func_wrapper的话,name参数就不能作为新的函数的输入参数传入。
函数有三种状态:1. 定义;2. 引用; 3. 调用
在上面的例子中:
my_get_text = p_decorate(get_text)
my_get_text = p_decorate(get_text("John"))
是调用加引用,先调用装饰器,返回func_wrapper函数,再用my_get_text方法引用func_wrapper。
而
my_get_text("John")
p_decorate(get_text())("John")
则是双重调用,先调用装饰器,然后再调用装饰器返回来的函数。
整体就是p_decorate和func_wrapper两者缺一不可,一个负责传入待装饰的函数,一个是装饰器返回的经过装饰过的函数。
Python里面不需要显式地进行赋值。用@符号即可。
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")
# Outputs <p>lorem ipsum, John dolor sit amet</p>