Python闭包和装饰器
闭包
- 内部嵌套函数,内部函数调用外部函数的变量
def outer():
a = 1
def inner(): #inner是一个闭包
print(a) #不用a就是一个嵌套函数
print(inner.__closure__) #出现cell就是一个闭包
return inner
inn = outer()
inn()
可以节省资源
装饰器的原则
传入的对象作为参数,其实传递的就是那个对象的内存地址
def func(): #被装饰的函数
time.sleep(10)
print()
def timer(f): #wrapper装饰
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #别装饰的函数 可以包括整个世界
end = time.time()
return ret
return inner #如果在这里执行将会出现 None 将会报错
func = timer(func) #加上 @timer
ret = func() #这个执行的就相当于执行Inner()
print(ret)
#带参数函数的装饰器
@timer func = timer(func)
def func(a): #被装饰的函数
time.sleep(10)
print()
ret = func(a) #此时的func已经是内部的对象了,称为了inner对象
开放封闭原则
- 开放:对扩展是开放的
- 封闭:对修改是封闭的
语法糖: @timer
最多有三层
def timer_out(flag):
def timer(f): #wrapper装饰
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #别装饰的函数 可以包括整个世界
end = time.time()
return ret
return inner #如果在这里执行将会出现 None 将会报错
return timer
Flag = True
@timer_out(Flag) #先执行 timer_out(Flag) == timer -> func = timer(func) ->func() = inner()
def func(a): #被装饰的函数
time.sleep(10)
print()
func()
多个装饰器装饰一个函数
def timer(f):
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
return ret
return inner
def timer1(f):
def inner1(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
return ret
return inner
@timer # func = timer(func) = timer(inner1) == inner2
@timer1 #先找最近的装修器: func = timer1 = inner1
def func(a): #被装饰的函数
time.sleep(10)
print()
func()
执行的像js中的冒泡一样,先进去后出来