【发布时间】:2010-12-08 02:34:28
【问题描述】:
我有一个消息总线,一个类为消息总线订阅了很多方法,例如:
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()
它可以工作,但是很难理解每个方法的消息路径是什么,我想要的是使用装饰器来订阅带有方法的消息总线,它看起来像这样
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
但是这里要解决一些难点,首先msg_bus属性属于instance,即属于self。我无法获得班级级别的 self.msg_bus。为了解决这个问题,我可以这样写:
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()
我尝试将订阅收集到 BookingService.subscribations 并稍后在 subscribe_all 中将它们添加到 msg_bus,但问题来了。我遇到了错误
subscribations.append((dest, func))
NameError: global name 'subscribations' is not defined
好像订阅不在订阅功能的范围内,请问如何解决?
【问题讨论】:
-
要最巧妙地做到这一点,您需要一个元类(或者可能是一个超类)。