Python闭包和装饰器

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中的冒泡一样,先进去后出来

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值