博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之闭包、装饰器
阅读量:7066 次
发布时间:2019-06-28

本文共 1581 字,大约阅读时间需要 5 分钟。

  一、学习Python的时候发现函数内部,还可以写函数,并且可以返回函数。觉得挺新奇的,主要是在探索装饰器(有点像Java的注解)的时候,发现这个理解还是很主要的,所以这里记录一下。

  二、闭包

  1)首先看一部分代码

def sum1(x):    def sum2(y):        print x + y    return sum2

  2)理解:

  a、外部传入一个参数

  b、在sum1内部声明了一个sum2函数,并且需要传参数,但是没有调用

  c、然后返回了sum2函数

  3)执行:

sum2 = sum1(10)sum2(2) //12sum2(4) //14

  4)闭包:在第一次调用完成后,按理说x应该用结束了,但是内部函数还需要使用。后续计算直接使用x的变量值得出x+y的结果。

  简单一点:就是外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数

  三、装饰器

  1)首先还是看一段代码和执行结果

def w1(fn):    print "w1"    def inner():        print "in1"        fn()    return innerdef w2(fn):    print "w2"    def inner():        print "in2"        fn()    return inner@w1@w2def f():    print "f"f()

  执行结果:

  

  2)说明

  装饰器:这个看着其实有点像AOP的过程,在spring中存在通过AOP的方式来进行切面,然后加入其它逻辑,比如:事务等。这里的修饰器也就是,在原来的函数基础上,做了更多地工作用来包装原本函数执行结果。

  注意:Python中的装饰器和spring中的AOP还是存在差别,就是装饰器是嵌套装饰的,AOP是一层一层切面的。(感觉也差不多)

  3)理解

  a、f()通过@w2装饰,即为:w2f = w2(f()).

  注意:这里返回的是w2中的inner,是以第一次包装后的函数。

  b、通过第二次包装@w1,然后返回w1w2f = w1(w2f)

   注意:这里包装的是@w2包装后的函数

  c、执行过程:包装顺序,从下往上。

          然后执行函数,执行w1w2f-->w2f-->f

   四、通用装饰器

  不带参数装饰器:

def func(function_name):        def func_in(*args, **kwargs):        return function_name(*args, **kwargs)        return func_in

   带参数的装饰器:

def func_arg(*args1, **kwargs1):    def func(function_name):        def func_in(*args2, **kwargs2):            return function_name(*args2, **kwargs2)        return func_in    return func

   类装饰器:

class ClassArg:    def __init__(self, func):        self.func = func    def __call__(self, *args, **kwargs):        self.func(*args, **kwargs)

 

转载于:https://www.cnblogs.com/ll409546297/p/10839522.html

你可能感兴趣的文章
《JavaScript高级程序设计》笔记
查看>>
刚刚在园里看到的一个简单的做连接字符串的方法.
查看>>
JQ_简单瀑布流
查看>>
测试管理-测试问题监控
查看>>
thinkphp的taglib的使用方法
查看>>
tecplot批量导出图片_Fluent 后处理软件Tecplot宏批量处理cas,dat为图片
查看>>
锂电池放空后充不进电_充电锂电池,只几个月不用,为什么就再也充不进电了?...
查看>>
golang mutex 初始化_Golang连接池的几种实现案例
查看>>
docker可以把应用及其相关的_等离子表面处理机相关应用及其特点
查看>>
发电厂电气部分第三版pdf_喜讯、大唐锡林浩特发电厂660mw机组投产运行
查看>>
WCF服务实现客户端Cookie共享,表单验证的解决方案
查看>>
Rule Or WorkFlow
查看>>
Unity自动构建
查看>>
Windows Phone 8.1上的开发人员请看
查看>>
BZOJ3118 : Orz the MST
查看>>
UVa 130 - Roman Roulette
查看>>
乌云首届安全峰会
查看>>
数据库操作(ADO)
查看>>
24点经典算法
查看>>
分享一个德州扑克的算法
查看>>