装饰器

参考博客链接
装饰器可以对已经存在的函数进行封装。

def get_text(name):
   return "lorem ipsum, {0} dolor sit amet".format(name)

def p_decorate(func):
   def func_wrapper(name):
       return "

{0}

".format(func(name)) return func_wrapper my_get_text = p_decorate(get_text) print my_get_text("John") #

Outputs lorem ipsum, John dolor sit amet

在上面的方面中,我们并没有改变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 "

{0}

".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

lorem ipsum, John dolor sit amet

你可能感兴趣的:(装饰器)