分享

自动为py类的每个方法添加装饰器

 dinghj 2014-05-01
'''Add decorator for each method of a class.'''
import functools
import threading
class DecorateClass(object):
    def decorate(self):
        for name, fn in self.iter():
            if callable(fn):
                self.operate(name, fn)
class LockerDecorator(DecorateClass):
    def __init__(self, obj, lock=threading.RLock()):
        self.obj = obj
        self.lock = lock
    def iter(self):
        return [(name,getattr(self.obj, name)) \
                for name in dir(self.obj) if not name.startswith('_')]
     
    def operate(self, name, fn):
        @functools.wraps(fn)
        def locker(*args,**kv):
            self.lock.acquire()
            try:
                return fn(*args, **kv)
            finally:
                self.lock.release()
        setattr(self.obj, name, locker)
class mylocker:
    def __init__(self):
        print("mylocker.__init__() called.")
    def acquire(self):
        print("mylocker.acquire() called.")
    def release(self):
        print("  mylocker.unlock() called.")
class Foo(object):
    def __init__(self):
        # Enable one or more decorators for each method:
        LockerDecorator(self).decorate()
        LockerDecorator(self, mylocker()).decorate()
         
    def interface1(self):
        print(" interface1() called.")
    def interface2(self):
        print(" interface2() called.")
    def _interface3(self):
        print("_interface3() called.")
if __name__=="__main__":
    obj = Foo()
    obj.interface1()
    obj.interface2()
    obj.interface1()
    obj.interface2()
    obj._interface3()
    print(obj.interface1.__name__)
    '''
    print(dir(obj))
    print("---------------------")
    for item in [(name,getattr(obj, name)) for name in dir(obj)]:
        print(item)'''

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多