私はメッセージ・バスを持ち、そしてクラスは、たとえば、メッセージバスに多くの方法をサブスクライブ:クラスレベルでのデコレータの使用方法は?
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属性が自己に、つまり、インスタンスに属します。クラスレベルで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
サブスクリプションはサブスクリプション機能の範囲にないようですが、この問題を解決するにはどうすればよいですか?
これを最もうまく行うには、メタクラス(またはおそらくスーパークラス)が必要です。 –