python闭包和装饰器

闭包

  • 定义:两个函数的嵌套,外部函数返回内部函数的引用,内函数运用了外部函数参数传入的临时变量。
  • 作用:装饰器的实现,提高代码的复用性
  • 缺点:引用了外部函数的局部变量,该变量没有及时释放,消耗内存
  • 模板:def 外部函数(a):                         ------必须含有参数,否则无嵌套的意义


                    def 内部函数(b):                  ------参数可有可无,
                           print(a+b)                            -----参数的运算操作
                     return 内部函数                          ------外部函数返回内部函数的引用


    func = 外部函数()      func()-------调用内部函数
装饰器

  • 定义:一种特殊的函数,由两个函数嵌套(即闭包)实现
  • 作用:在不修改函数的参数及返回值的前提下,对函数增加额外功能
  • 使用场景:插入日志,函数执行时间统计函数前后操作处理,权限校验,缓存等
  • 万能装饰器模板:


def get_fun(func):                                        ------外部函数,参数是传入的原函数
    def call_fun(*args.**kwargs):                 ------内部函数,是装饰后函数的引用
          print("增加功能“)                     ------为原函数添加功能代码
          return func(*args,**kwargs) ------原函数调用,return可返回原函数的返回值
    return call_fun                                        ------外部函数返回内部函数,指向装饰后的函数


@get_fun                -----test= get_fun(test),调用外部函数,返回内部函数赋给装饰后的函数
def test(*args,**kwargs):                  ------和func和call_fun的参数三者一致
     print("原功能”)                   ------原函数功能代码
test(**,***)                                -----装饰后函数调用,参数必须满足原函数参数内容

  • 多个装饰器装饰同一个函数:(按照秋裤大法和电梯大法)


@装饰器A                                         
@装饰器B
def test(*args,**kwargs
      print("原功能”)
test(**,***)
实现过程解释:代码由上往下执行,每个装饰器由于要调用函数,所以要在下一句代码找        
函数,装饰器A找不到,则暂停不调用执行,继续往下走。直到装饰器B下面为原函数,则        
调用B装饰器外部函数返回B内部函数的引用,这时装饰器A下面有函数的引用了,调用该引
执行A装饰器外部函数,返回A装饰器的内部函数给装饰AB后的新函数,再次调用函数
功能增加

  • 扩展:类装饰器


模板:
class Test(object):                        ------创建类装饰器的类
    def __init__(self,func):                ------把原函数引用传进初始化方法作为实例属性
        self.func = func
    def __call__(self):                ------当test()自动调用方法,实现功能增加函数调用
        print(“新功能”)
        self.func()                
@Test          ------test = Test(test)等同于使用类Test创建了一个对象test()再赋给test函数
def test():
    print("原功能")
test()

更多技术资讯可关注:gzitcast

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...