博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
18-python基础7-闭包函数和装饰器
阅读量:6868 次
发布时间:2019-06-26

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

1.闭包

在函数内部定义的函数包含对外部作用域(非全局作用域)的引用,这样的函数叫做闭包函数。

示例:

#----------------------------------name='tom'def func():     name='jack'     def bar():         print(name)     return bar  f = func()     # f = barf()        # 调用bar()#输出结果:jack

上述代码运行结果打印的是jack而不是tom,bar这个函数就是闭包函数。

闭包函数属性:

  • 闭包函数是内部函数

  • 包含对外部作用域而非全局作用域的引用

闭包函数特点:

  • 自带作用域

  • 延迟计算

注意:

函数的作用域关系在函数定义阶段就已经固定,与调用位置无关,无论函数在何处调用,都需要回到定义阶段去找对应的作用域关系。

查看一个函数是否是闭包函数可以使用__closure__方法:name='tom'def func():     name='jack'     def bar():         print(name)     return bar  f = func()     # f = barf()        # 调用bar()print(f.__closure__)  #如果是闭包函数返回引用的外部作用域对象print(f.__closure__[0].cell_contents) #返回闭包函数引用外部作用域的值,[0]就是取第一个对象的值,有多个也可以这样取出

总结

闭包函数的基本形式:

# def 外部函数名():#     内部函数需要的变量#     def 内部函数():#         引用外部变量#     return 内部函数

装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能,使用装饰器能够使用原函数名调用实现除了原来功能之外的扩展功能。

定义比较抽象,下面举个例子:

def deco(func):    def wrapper(*args,**kwargs):   #这个就相当于是修饰后的新函数        print('before')        res = func(*args,**kwargs)  #意味着传入函数可以接收可变长参数        print('after')        return res    #这个返回值就是传入函数的返回值    return wrapper@deco     #将下面的foo作为参数传入deco(),等同于foo = deco(foo),这时候的foo = wrapperdef foo(x,y):    print('this is foo')    return x+yfoo(2,3)     #调用foo其实就是执行wrapper# print(foo(2,3))    #测试返回值

装饰器的原则

  • 不能修改被装饰的函数的源代码

  • 不能修改被装饰的函数的调用方式

装饰器的作用

在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

多个装饰器调用

@auth     #foo = auth(time(foo))@time     #foo = time(foo)def foo():    pass

调用顺序可以理解为:先调用auth,再调用time,再调用foo。总结就是从外到内(从上往下)执行,判断调用关系就是从内到外。相当于给foo函数增加了time功能和auth两个功能,包了两层,一层一个功能。

转载于:https://www.cnblogs.com/NewTaul/p/7049388.html

你可能感兴趣的文章
js创建,获取,检测cookie
查看>>
子查询:相关子查询、无关子查询
查看>>
Python-使用Magellan进行数据匹配总结
查看>>
jersey rest webservice
查看>>
java 获取指定日前的前一天
查看>>
position
查看>>
ios内存管理(转)
查看>>
Unity 屏幕外死亡的敌人的分数显示在屏幕内
查看>>
整理网上的关于 路径遍历漏洞
查看>>
H5 离线缓存的用法
查看>>
我们为什么需要Windows Workflow Foundation?(摘)
查看>>
五笔打字学习
查看>>
vector
查看>>
printf("%d\n",printf("%d",printf("%d",i)));
查看>>
最小转弯问题
查看>>
Java线程(一)
查看>>
JQuery的几个小问题
查看>>
hover带有动画效果的导航
查看>>
post提交表单
查看>>
Google maps API开发(二)(转)
查看>>