ライブラリを設計するときに、デコレータを使用してコールバックを簡単に登録できるようにしたかったのですが、問題は、それらが両方とも Consumer の同じインスタンスを使用していることです。
これらの両方の例が同じプロジェクトに共存できるようにしています。
class SimpleConsumer(Consumer):
@Consumer.register_callback
def callback(self, body)
print body
class AdvancedConsumer(Consumer):
@Consumer.register_callback
def callback(self, body)
print body
a = AdvancedConsumer()
s = SimpleConsumer()
ここで何が起こるかというと、AdvancedConsumer のコールバック実装が、最後に定義されている SimpleConsumer のものをオーバーライドします。
デコレータ クラスの実装は非常に単純です。
class Consumer(object):
def start_consumer(self):
self.consuming_messages(callback=self._callback)
@classmethod
def register_callback(cls, function):
def callback_function(cls, body):
function(cls, body)
cls._callback = callback_function
return callback_function
実装には非常に満足していますが、誰かが 2 番目のコールバックを登録する可能性があるため、今後問題が発生しないようにしたいと考えています。それで、静的ではない方法でこれを実装する方法について誰か提案がありますか?
ここに示されている実装は明らかに単純化されており、予防措置として、コードにこのようなものがあります。
if cls._callback:
raise RuntimeError('_callback method already defined')