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)
复制代码

 

posted @   Mars.wang  阅读(1607)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示