• python装饰器


      1 #coding=utf-8
      2 import sys
      3 '''
      4 Created on 2016年8月7日
      5 
      6 @author: yongliu
      7 '''
      8 
      9 def deco(func):
     10     print("before myfunc() called.")
     11     func()
     12     print("after myfunc() called.")
     13     return func
     14 
     15 @deco
     16 def myfunc():
     17     print("myfunc() called." )
     18     return 'ok'
     19 
     20     
     21 def deco2(func):
     22     def _deco():
     23         print("before myfunc() called.")
     24         ret = func()
     25         print("after myfunc() called.")
     26         return ret
     27     return _deco
     28 
     29 @deco2
     30 def myfunc2():
     31     print("myfunc2() called.")
     32     return 'ok'
     33 
     34 
     35 
     36 def deco3(func):
     37     def _deco(a, b):
     38         print("before %s called." % func.__name__)
     39         ret = func(a, b)
     40         print("after %s called. result: %s" % (func.__name__, ret))
     41         return ret
     42     return _deco
     43  
     44 @deco3
     45 def myfunc3(a, b):
     46     print(" myfunc3(%s,%s) called." % (a, b))
     47     return a + b
     48 
     49 def deco4(func):
     50     def _deco(*args, **kwargs):
     51         print("before %s called." % func.__name__)
     52         ret = func(*args, **kwargs)
     53         print("after %s called. result: %s" % (func.__name__, ret))
     54         return ret
     55     return _deco
     56  
     57 @deco4
     58 def myfunc41(a, b):
     59     print(" myfunc41(%s,%s) called." % (a, b))
     60     return a+b
     61  
     62 @deco4
     63 def myfunc42(a, b, c):
     64     print(" myfunc42(%s,%s,%s) called." % (a, b, c))
     65     return a+b+c
     66  
     67 def deco5(arg):
     68     def _deco(func):
     69         def __deco():
     70             print("before %s called [%s]." % (func.__name__, arg))
     71             func()
     72             print("  after %s called [%s]." % (func.__name__, arg))
     73         return __deco
     74     return _deco
     75  
     76 @deco5("mymodule")
     77 def myfunc51():
     78     print(" myfunc51() called.")
     79  
     80 @deco5("module2")
     81 def myfunc52():
     82     print(" myfunc52() called.")
     83     
     84     
     85     
     86 class locker:
     87     def __init__(self):
     88         print("locker.__init__() should be not called.")
     89          
     90     @staticmethod
     91     def acquire():
     92         print("locker.acquire() called.(这是静态方法)")
     93          
     94     @staticmethod
     95     def release():
     96         print("locker.release() called.(不需要对象实例)")
     97  
     98 def deco6(cls):
     99     '''cls 必须实现acquire和release静态方法'''
    100     def _deco(func):
    101         def __deco():
    102             print("before %s called [%s]." % (func.__name__, cls))
    103             cls.acquire()
    104             try:
    105                 return func()
    106             finally:
    107                 cls.release()
    108         return __deco
    109     return _deco
    110  
    111 @deco6(locker)
    112 def myfunc6():
    113     print("myfunc6() called.")
    114  
    115  
    116  
    117  
    118  
    119 class mylocker7:
    120     def __init__(self):
    121         print("mylocker7.__init__() called.")
    122          
    123     @staticmethod
    124     def acquire():
    125         print("mylocker7.acquire() called.")
    126          
    127     @staticmethod
    128     def unlock():
    129         print("mylocker7.unlock() called.")
    130  
    131 class lockerex7(mylocker7):
    132     @staticmethod
    133     def acquire():
    134         print("lockerex7.acquire() called.")
    135          
    136     @staticmethod
    137     def unlock():
    138         print("  lockerex7.unlock() called.")
    139  
    140 def lockhelper(cls):
    141     '''cls 必须实现acquire和release静态方法'''
    142     def _deco(func):
    143         def __deco(*args, **kwargs):
    144             print("before %s called." % func.__name__)
    145             cls.acquire()
    146             try:
    147                 return func(*args, **kwargs)
    148             finally:
    149                 cls.unlock()
    150         return __deco
    151     return _deco
    152  
    153  
    154 #from mylocker import *
    155  
    156 class example:
    157     @lockhelper(mylocker7)
    158     def myfunc(self):
    159         print(" myfunc() called.")
    160  
    161     @lockhelper(mylocker7)
    162     @lockhelper(lockerex7)
    163     def myfunc2(self, a, b):
    164         print(" myfunc2() called.")
    165         return a + b
    166 
    167 
    168 
    169 if __name__ == '__main__':
    170     print "---------------------"
    171     #myfunc = deco(myfunc);
    172     print myfunc()
    173     print "---------------------"
    174     print myfunc2()
    175     print "---------------------"
    176     print myfunc3(3, 4)
    177     print "---------------------"
    178     myfunc41(1, 2)
    179     myfunc41(3, 4)
    180     myfunc42(1, 2, 3)
    181     myfunc42(3, 4, 5)
    182     print "---------------------"
    183     myfunc51()
    184     myfunc52()
    185     print "---------------------"
    186     myfunc6()
    187     myfunc6()
    188     print "---------------------"
    189     
    190     a = example()
    191     a.myfunc()
    192     print(a.myfunc())
    193     print(a.myfunc2(1, 2))
    194     print(a.myfunc2(3, 4))
    195     
    196     pass
    出自datakv
  • 相关阅读:
    nodejs中exports与module.exports的区别
    Webpack--自学笔记
    cookie、sessionStorage、localStorage 详解
    JavaScript中URL的解码和编码
    javascript中怎么判断对象{}为空
    关于获取、设置css样式封装的函数入门版
    多行文本溢出显示省略号(…)
    前端优化的问题
    volatile
    MySQL(六) decimal数据默认处理
  • 原文地址:https://www.cnblogs.com/datakv/p/5746656.html
Copyright © 2020-2023  润新知