python装饰器应用

mac2025-12-04  10

1.简单注册表

funcs = [] def register(func): funcs.append(func) return func @register def a(): return 3 @register def b(): return 5 result = [func() for func in funcs] # 访问结果 # [3,5]

 

2.接收rabbit包,根据包字段不同注册不同函数调用

class MqModel: def __init__(self): self.registryCenter = {} def msg_dispacher(self,body, message): """ 数据分发 :param body: :param message: :return: """ try: jdata = json.loads(body) head = jdata['head'] except ValueError: print("Not support non-json msg",body) message.ack() return finally: if 'op' not in head: message.ack() print("special msg ERROR", body) return if head['op'] in self.registryCenter: for func in self.registryCenter[head['op']]: func(jdata) else: print("jdata['op'] not in self.registryCenter:") def registryConsumer(msgtype): def wrapper(func): if msgtype in mqModel.registryCenter: mqModel.registryCenter[msgtype].append(func) else: mqModel.registryCenter[msgtype]=[func] return wrapper @registryConsumer('web-phone-update') def receive_statusMsg(body): """ 注册收报回调 :param body: :param message: :return: """ print('web-phone-update') print(body)

3.使用装饰器在函数前后添加一行Log

def log(function): def wrapper(*args,**kwargs): print('before func') res = function(*args,**kwargs) print('after func') return res return wrapper @log def func(str): print('execute func %s' % str)

4.使用带参数的装饰器

import functools def log(text): def decorate(function): @functools.wraps(function) def wrapper(*args, **kwargs): print('%s before func' % text) res = function(*args, **kwargs) print('%s after func' % text) return res return wrapper return decorate @log('param') def func(str): print('execute func %s' % str)

5.装饰器实现的单例模式

def singleton(cls, *args, **kwargs): instance = {} def _singleton(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return _singleton @singleton class test_singleton(object): name = None def __init__(self): self.sum = 0 def add(self, name): self.name = name if __name__ == '__main__': cls1 = test_singleton() cls1.add('cls1') cls2 = test_singleton() cls2.add('cls2') cls3 = test_singleton() cls3.add('cls3') print(cls1) print(cls2) print(cls3) print(cls1.name) print(cls2.name) print(cls3.name)

 

最新回复(0)