装饰器

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

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.函数装饰器 1.从Python内层函数说起 首先我们来探讨一下这篇文章所讲的内容Inner Functions...
    软体动物Ai阅读 3,278评论 0 14
  • 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,...
    chen_000阅读 1,373评论 0 3
  • 返回函数 函数作为返回值。 调用A时,返回函数a,调用a时,返回值 闭包在函数里又定义了新函数,内部函数可以引用外...
    某米狼阅读 644评论 0 1
  • 装饰是为函数和类指定管理代码的一种方式.装饰器本身的形式是处理其他的可调用对象的可调用的对象。 函数装饰器在函数定...
    低吟浅唱1990阅读 236评论 0 0
  • 大冷天,黄昏时分,公园里空旷、冷清、静谧,夕阳只是静静的展现她的美,然后被临时兴起逛公园的我们遇到了,小惊喜...
    打吉先生阅读 239评论 0 0