python 装饰器 初步认识

系统 330 0
首先理解Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。
前面的文章已经对闭包做了介绍,再次进行延伸和理解一下装饰器,主要用于不在改变源代码的情况下进行添加功能,装饰器利用闭包来实现,一般和闭包一起使用。
装饰器返回一个函数对象,简单理解在原函数功能上又加入新功能并返回一个和原函数名相同的函数对象。
            
              def funcout(func):    
	def funcIn(x,y):       
 		func(x,y)#外部函数传入的参数test函数在内部函数的调用        
		 addf()#新增功能函数    
	 return funcIn
 #闭包 外部无法直接访问内部函数  将一个函数当成参数传递进来 funcout(test)调用时返回一个函数对象 用一个变量接收函数对象的地址比如假设为ss
 #ss(1,2) 调用的内部函数  func是传进来的函数test 此时func调用传入的函数  test需要两个参数 需要在内部函数中传参
def addf():    
	print("新增功能")
def test(a,b):    
	print("a=%s,b=%s"%(a,b))
ff =funcout(test)
ff(1,2)#调用函数 


            
          
            
              在上面代码将函数test 进行替换成下列调用方式 就是加了一个@符号 实现装饰器写法更简单
@funcout # 装饰器 相当于 test=func(test)
def test(a,b):    
	print("a=%s,b=%s"%(a,b))
test(1,2)#调用函数test 为装饰器的函数 增加新的功能之后的test

            
          
通用装饰器函数 对可变参数的处理
            
              def funcout(func):   
 	def funcIn(*args,**kwargs)        
		 func(*args,**kwargs) #没有返回值时使用       
		 addf()       
        	return funcIn(*args,**kwargs)       #内部函数的返回值 防止传入的函数有返回值  有返回值时使用     	
	return funcIn  

            
          
            
              还可以定义多个装饰器 执行顺序是从里到外的。
@a
@b
@c
def f ():
等效于  f = a(b(c(f)))

            
          
            
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论