zoukankan      html  css  js  c++  java
  • python用类实现装饰器

    一般实现python装饰器都是采用方法的模式,看起来有点复杂,模式如下:

    def send_msg_simple(url):
        def decorator(func):
            def wrapper(*args, **kw):
                func(*args, **kw)
                group_robot(url, "完毕:%s.%s" % (kw['db'], kw['table']))
    
            return wrapper
    
        return decorator

    但其实也可以采用类的方式,看起来逻辑更为清晰:

    class DecoratorTest(object): #定义一个类
        def __init__(self,func):
            self.__func = func
        def __call__(self):  #定义call方法,当直接调用类的时候,运行这里。
            print('pre msg')
            self.__func()    
            print('post msg')
    
    
    @DecoratorTest  
    def test():
        print('主函数体')
    
    
    if __name__=='__main__':
        test() 

     下面是cookbook上的类装饰器实现,略有不同

    # 为了将装饰器定义成一个类,你需要确保它实现了 __call__() 和 __get__() 方 法。
    # 例如,下面的代码定义了一个类,它在其他函数上放置一个简单的记录层:
    import types
    from functools import wraps
    
    class Profiled:
        def __init__(self, func):
            wraps(func)(self)
            self.ncalls = 0
        def __call__(self, *args, **kwargs): 
            self.ncalls += 1
            return self.__wrapped__(*args, **kwargs)
        def __get__(self, instance, cls): 
            if instance is None:
                return self 
            else:
                return types.MethodType(self, instance)
    
    # 你可以将它当做一个普通的装饰器来使用,在类里面或外面都可以:
    @Profiled
    def add(x, y): 
        return x + y
    
    class Spam: 
        @Profiled
        def bar(self, x): 
            print(self, x)
  • 相关阅读:
    9-15
    9-5
    8-26
    8-24
    7-20
    7-17
    我离职后要干些什么
    6-18
    5-28
    5-20
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/12098380.html
Copyright © 2011-2022 走看看