Python 装饰器原理和基本实现
Python 装饰器原理和基本实现
http://www.cnblogs.com/wupeiqi/articles/4980620.html
装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。
装饰器是设计模式的一种,被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
无参数
def login(func): #func = tv print("passed user verification.....") #func() return func #return tv的内存地方 def home(name): print("Welcome [%s] to home page!" %name) def tv(): print("Welcome [%s] to TV page!") def movie(name): print("Welcome [%s] to movie page!" %name) tv = login(tv) tv() /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day3/装饰器.py passed user verification..... Welcome [%s] to TV page! 进程已结束,退出代码0 def login(func): #func = tv print("passed user verification.....") #func() return func #tv 的内存地址 def home(name): print("Welcome [%s] to home page!" %name) @login def tv(name): print("Welcome [%s] to TV page!"%name ) def movie(name): print("Welcome [%s] to movie page!" %name) tv('wwww') # tv = login(tv) # tv('wwww') /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day3/装饰器.py passed user verification..... Welcome [wwww] to TV page! 进程已结束,退出代码0 @login tv = login(tv)
一个参数
def login(func): #func = tv def inner(arg): print("passed user verification.....") #func() return func(arg) #tv 的内存地址 return inner def home(name): print("Welcome [%s] to home page!" %name) # @login def tv(name): print("Welcome [%s] to TV page!"%name ) def movie(name): print("Welcome [%s] to movie page!" %name) # tv('wwww') tv = login(tv) tv('wwww')
多参数
def login(func): #func = tv def inner(*args,**kwargs): print("passed user verification.....") #func() return func(*args,**kwargs) #tv 的内存地址 return inner def home(name): print("Welcome [%s] to home page!" %name) @login def tv(name,passwd): print("Welcome [%s] to TV page!"%name ) @login def movie(name): print("Welcome [%s] to movie page!" %name) # # tv('wwww') # tv = login(tv) tv('wwww',passwd='123') movie('wwwwwwwww') /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day3/装饰器.py passed user verification..... Welcome [wwww] to TV page! passed user verification..... Welcome [wwwwwwwww] to movie page! 进程已结束,退出代码0
简例
http://www.cnblogs.com/wupeiqi/articles/4980620.html def w1(func): def inner(arg): # 验证1 # 验证2 # 验证3 return func(arg) return inner @w1 def f1(arg): print ('f1') print('-------1--------') f1('1111') def w1(func): def inner(arg1,arg2): # 验证1 # 验证2 # 验证3 return func(arg1,arg2) return inner @w1 def f1(arg1,arg2): print ('f1') print('-------2--------') f1('2222','22') def w1(func): def inner(arg1,arg2,arg3): # 验证1 # 验证2 # 验证3 return func(arg1,arg2,arg3) return inner @w1 def f1(arg1,arg2,arg3): print ('f1') print('-------3--------') f1('3333','33','333') def w1(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return inner @w1 def f1(arg1,arg2,arg3,arg4): print ('f1') print('-------4--------') f1('4','44','444','4444') def w1(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return inner def w2(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return inner @w1 @w2 def f1(arg1,arg2,arg3): print ('f1') print('-------5--------') f1('5','55','555') /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day3/naozi.py -------1-------- f1 -------2-------- f1 -------3-------- f1 -------4-------- f1 -------5-------- f1