[Python]装饰器

  
  
  
  
  1. #!/usr/local/bin/python3 
  2. #coding=UTF-8 
  3. ''''' 
  4. Created on 2011-2-25 
  5. @author: Jacky 
  6. ''' 
  7. #函数风格的装饰器 
  8. #装饰器函数,不带参数,对不带参数的函数进行装饰 
  9. def doAround(function): 
  10.     #wrapper函数对传入的function函数进行包装, 
  11.     def wrapper(): 
  12.         print("before "+function.__name__+" called"
  13.         result = function() 
  14.         print("after "+function.__name__+" called"
  15.         return result 
  16.     return wrapper 
  17.  
  18. def display(): 
  19.     print("display called"
  20.  
  21. #不使用装饰器 
  22. display = doAround(display) 
  23. display() 
  24. print() 
  25.  
  26. #使用装饰器 
  27. @doAround 
  28. def display(): 
  29.     print("display called"
  30.  
  31. display() 
  32. print() 
  33.  
  34. #装饰器函数,不带参数,对带参数的函数进行装饰 
  35. def doAround(function): 
  36.     #wrapper函数对传入的function函数进行包装, 
  37.     def wrapper(a,b): 
  38.         print("before "+function.__name__+" called"
  39.         result=function(a,b) 
  40.         print("after "+function.__name__+" called"
  41.         return result 
  42.     return wrapper 
  43. @doAround 
  44. def display(a,b): 
  45.     print("display called",a,b) 
  46.      
  47. display(10,20
  48. print() 
  49.  
  50. #装饰器函数,不带参数,对变长参数的函数进行装饰 
  51. def doAround(function): 
  52.     #wrapper函数对传入的function函数进行包装, 
  53.     def wrapper(*arg,**args): 
  54.         print("before "+function.__name__+" called"
  55.         result = function(*arg,**args) 
  56.         print("after "+function.__name__+" called"
  57.         return result 
  58.     return wrapper 
  59. @doAround 
  60. def display(*arg,**args): 
  61.     print("display called",arg,args) 
  62.      
  63. display(10,20,30,name="zhang"
  64. print() 
  65.  
  66. #装饰器函数,带参数,对变长参数的函数进行装饰 
  67. def doAround(a): 
  68.     def _doAround(function): 
  69.         #wrapper函数对传入的function函数进行包装, 
  70.         def wrapper(*arg,**args): 
  71.             print(a) 
  72.             print("before "+function.__name__+" called"
  73.             result = function(*arg,**args) 
  74.             print("after "+function.__name__+" called"
  75.             return result 
  76.         return wrapper 
  77.     return _doAround 
  78. #不使用装饰器 
  79. def display(*arg,**args): 
  80.     print("display called",arg,args) 
  81.  
  82. display = doAround("decorate doAround")(display) 
  83. display(10,20,30,40,name="wang"
  84. print() 
  85. #使用装饰器  
  86. @doAround("decorate doAround"
  87. def display(*arg,**args): 
  88.     print("display called",arg,args) 
  89. display(10,20,30,40,name="wang"
  90. print() 
  91.  
  92. #类风格的装饰器,不带参数 
  93. class doAround(object): 
  94.     def __init__(self,function): 
  95.         self.function = function 
  96.  
  97.     def __call__(self,*args): 
  98.         print("before "+self.function.__name__+" called"
  99.         result = self.function(*args) 
  100.         print("after "+self.function.__name__+" called"
  101.         return result 
  102.  
  103. @doAround 
  104. def display(*args): 
  105.     print("display called",args) 
  106. display(10,20
  107. print() 
  108.  
  109. #类风格的装饰器,带参数 
  110. class doAround(object): 
  111.     def __init__(self,darg): 
  112.         self.dargs = darg 
  113.         print(darg) 
  114.  
  115.     def __call__(self,function): 
  116.         def wrapper(*args):     
  117.             print("before "+function.__name__+" called"
  118.             result = function(*args) 
  119.             print("after "+function.__name__+" called"
  120.             return result 
  121.         return wrapper 
  122. #不使用装饰器 
  123. def display(*args): 
  124.     print("display called",args) 
  125. display = doAround("decorate doAround")(display) 
  126. display(10,20
  127. print() 
  128. #使用装饰器 
  129. @doAround("decorate doAround"
  130. def display(*args): 
  131.     print("display called",args) 
  132. display(10,20
  133. print() 

 

你可能感兴趣的:(python,装饰器)