什么是装饰器:
是一个修饰函数把原函数包裹在装饰函数中,并且改变原函数的行为但原函数本身不变。(可类比生活中同一个人要拍结婚照了需要多套衣服,每套衣服是变的,都需要重用参与者肉身并不能改变肉身,那么就通过衣服把肉身包裹起来,然后完成各组拍照。衣服就是装饰,怎么实现换衣服并完成拍照就是装饰器的作用)
函数装饰器实例
import functools
def decorator(func): # 函数作为参数传入
@functools.wraps(func) # 解决原函数被替换为test函数问题
def test(*args,**kwargs): #*args,**kwargs 不知道传入的参数类型和数量,定义一个泛型
print '-----------------------' #在源函数前添加装饰操作
func(*args,**kwargs) #在修饰函数中调用原函数
print '=======================' #在源函数后添加装饰操作
return test #闭包
@decorator #装饰器调用语法糖
def testfunc(param,param1): #原函数
print "base func : " + param +" : "+ param1
testfunc('hahaha','22222222222')
print testfunc.__name__ #输出原函数的名字testfunc
执行结果
-----------------------
base func : hahaha : 22222222222
=======================
testfunc
类装饰器实例
class test:
def __init__(self,func):
self.func = func
self.num_calls =0
print '1111111111111111111111'
def __call__(self, *args, **kwargs):
print ">>>>>>>>>>111"
self.num_calls +=1
print ('num is :' + str(self.num_calls))
return self.func(*args,**kwargs)
class test2:
def __init__(self,func):
self.func = func
self.num_calls =0
print '2222222222222222222'
def __call__(self, *args, **kwargs):
print '=============222222222222222'
self.num_calls +=10
print ('num is :' + str(self.num_calls))
return self.func(*args,**kwargs)
@test
@test2
def example():
print "aaaaaaaaaaaa"
example()
调用结果:
2222222222222222222
1111111111111111111111
>>>>>>>>>>111
num is :1
=============222222222222222
num is :10
aaaaaaaaaaaa
理解基础:
1 函数是对象,函数可以赋值给变量
2 函数可以作为参数传入另一个函数中
3 函数嵌套,函数中定义函数
4 闭包,return 返回值是函数对象
5 @语法糖
6 实用场景:1 认证 2 日志处理 3数据校验 4单元测试时初始化和清理数据 5 并发、控制计数 等等来重用代码但是不去改动重用块的本身