J'ai un bus de messages, et une classe abonnée de nombreuses méthodes pour le bus de messages, par exemple:Comment utiliser correctement un décorateur en classe?
class BookingService(object):
def start(self):
self.msg_bus.login(self.user, self.password)
self.msg_bus.subscribe('/broadcast/aliveResponse', self.handleAliveResponse)
self.msg_bus.subscribe('/broadcast/musicInfoUpdated', self.handleMusicInfo)
self.msg_bus.subscribe('/broadcast/radioOnline', self.handleRadioOnline)
self.msg_bus.subscribe('/broadcast/radioOffline', self.handleRadioOffline)
self.msg_bus.subscribe('/broadcast/online', self.handleBroadcastOnline)
self.msg_bus.subscribe('/proxy/aliveResponse', self.handleEvent)
self.msg_bus.subscribe('/proxy/online', self.handleProxyOnline)
self.msg_bus.subscribe('/proxy/radioReady', self.handleEvent)
self.msg_bus.subscribe('/proxy/radioUpdate', self.handleEvent)
self.msg_bus.subscribe('/proxy/radioClosed', self.handleEvent)
self.msg_bus.subscribe('/message_bus/detached', self.handleDetached)
self.msg_bus.run()
Il fonctionne, mais il est difficile de comprendre ce qui est le chemin du message pour chaque méthode, ce que je veux est d'utiliser un décorateur pour vous abonner au bus de message avec méthode, il serait ressemble à ce
class BookingService(object):
@subscribe('/broadcast/aliveResponse')
@subscribe('/broadcast/onLine')
def handleEvent(self, dest, data):
print dest, data
@subscribe('/proxy/aliveResponse')
def handleAnotherEvent(self, dest, data):
print dest, data
Mais voici quelques difficultés à résoudre, tout d'abord, l'attribut msg_bus appartient à l'instance, à savoir, à l'auto. Je ne peux pas obtenir le self.msg_bus au niveau de la classe. Pour résoudre ce problème, je peux l'écrire comme ceci:
class BookingService(object):
subscribations = []
def subscribe(dest):
"""Decorator for subscribing function to destination
"""
def callee(func):
subscribations.append((dest, func))
return func
return callee
def subscribe_all(self):
for dest, func in self.subscribations:
self.msg_bus.subscribe(dest, func)
@subscribe('/broadcast/aliveResponse')
def handleEvent(self, dest, data):
print dest, data
def start(self):
self.subscribe_all()
J'essaie de recueillir les souscriptions dans BookingService.subscribations et les ajouter à msg_bus plus tard dans subscribe_all, mais voilà le problème. Je suis une erreur
subscribations.append((dest, func))
NameError: global name 'subscribations' is not defined
Il semble que les subscribations ne sont pas dans le cadre de la fonction abonnez-vous, comment résoudre ce problème?
Pour ce faire, vous aurez besoin d'une métaclasse (ou éventuellement d'une super classe). –