两层函数嵌套,内层函数用到了外层函数的参数,外部函数的变量和内部函数的整体称为闭包,可以作为参数进行传递,传递时不仅传递函数功能,也传递参数
闭包是装饰器的实现原理
def test1(num):
def test2():
nonlocal num
print(num)
num = 100
print(num)
return test2
t1 = test1(3)
t1()
函数/匿名函数/闭包/对象,当作实参时有什么区别?
1.匿名函数,能够完成基本简单功能,传递函数的引用,只有功能
2.普通函数,能完成复杂的功能,传迪函数的引用
3.闭包,较为复杂的功能,能够传递功能和数据
4.对象,能完成最为复杂的功能,传递很多数据和很多功能
装饰器
#coding=utf-8
def set_func(func):
def call_func():
print("添加的装饰器的功能代码1")
print("添加的装饰器的功能代码2")
return func() # 相当与把被装饰的函数拉了进来,使用return使装饰器通用
return call_func
@set_func
def sunny():
print("today is sunny!")
sunny()
装饰器用到了闭包,内层函数共享外层函数参数,和函数引用作为参数的特点
多个装饰器装饰的顺序
@set_func0
@set_func1
@set_func2
def sunny():
print("today is sunny!gfsdf")
func2 --> func1 --> func0 --> func0 --> func1 --> func2 --> sunny
类装饰器
class Test(object):
def __init__(self,func):
self.func = func
print("添加的装饰器的功能代码TTTTTTTTT")
def __call__(self, *args, **kwargs):
print("添加的装饰器的功能代码TEEEESSSSSSTTTTT")
return self.func() # 相当与把被装饰的函数拉了进来
@Test
def sunny():
print("today is sunny!gfsdf")