python装饰器

来源:互联网 发布:淘宝达人怎么加粉丝 编辑:程序博客网 时间:2024/03/29 13:50

转载:http://bu-choreography.iteye.com/blog/1236881


python中最不想python风格的就是装饰器了,特别是‘@’很令新来python的人费解,不过装饰器可是很强大的功能。 
装饰器语法有两种,类风格和函数风格 
类风格例子: 
Python代码  收藏代码
  1. class entryExit(object):  
  2.   
  3.     def __init__(self, f):  
  4.         self.f = f  
  5.   
  6.     def __call__(self):  
  7.         print "Entering"self.f.__name__  
  8.         self.f()  
  9.         print "Exited"self.f.__name__  
  10.  
  11. @entryExit  
  12. def func1():  
  13.     print "inside func1()"  
  14.  
  15. @entryExit  
  16. def func2():  
  17.     print "inside func2()"  
  18.   
  19. func1()  
  20. func2()  

输出结果是 
Python代码  收藏代码
  1. Entering func1  
  2. inside func1()  
  3. Exited func1  
  4. Entering func2  
  5. inside func2()  
  6. Exited func2  

类装饰的设计需要连个方法,包含参数为装饰函数的初始化函数和代替执行函数的__call__函数,当该python文件被编译时,先执行初始化方法,当被装饰的函数被执行的时候执行__call__方法中的内容,自己本身的执行内容也被__call__方法替代,因此把装饰函数提前在初始化方法中为__call__准备好使用。 
函数风格代码比较简单: 
Python代码  收藏代码
  1. def entryExit(f):  
  2.     def new_f():  
  3.         print "Entering", f.__name__  
  4.         f()  
  5.         print "Exited", f.__name__  
  6.     return new_f  
  7.  
  8. @entryExit  
  9. def func1():  
  10.     print "inside func1()"  
  11.  
  12. @entryExit  
  13. def func2():  
  14.     print "inside func2()"  
  15.   
  16. func1()  
  17. func2()  
  18. print func1.__name__  

结果同上,其中的new_f是python语法中的闭包,打印函数名称时打印了'new_f',如果想打印当前调用的函数,则可修改为 
Python代码  收藏代码
  1. def entryExit(f):  
  2.     def new_f():  
  3.         print "Entering", f.__name__  
  4.         f()  
  5.         print "Exited", f.__name__  
  6.     new_f.__name__ = f.__name__  
  7.     return new_f