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)
原文地址:https://www.cnblogs.com/wangbin2188/p/12098380.html