Предлагаю сократить количество классов - помните, что Python - это не Java. Каждый раз, когда вы используете @classmethod
или @staticmethod
, вы должны остановиться и подумать об этом, поскольку эти ключевые слова встречаются в Python довольно редко.
Делать так, как это работает:
class BaseEvent(object):
def __init__(self, event_info=None):
self._subscriptions = set()
self.info = event_info
def fire(self, data):
for callback in self._subscriptions:
callback(self.info, data)
def subscribe(self, callback):
if not callable(callback):
raise ValueError("%r is not callable" % callback)
self._subscriptions.add(callback)
return callback
new_user = BaseEvent()
@new_user.subscribe
def on_new_user_registration(info, username):
print "new user: %s" % username
new_user.fire("Martin")
Если вам нужен класс Observer, то вы можете сделать это следующим образом:
Наблюдатель класса:
@staticmethod
@new_user.subscribe
def on_new_user_registration(info, username):
print "new user: %s" % username
Но учтите, что у статического метода нет доступа к экземпляру протокола, так что это, вероятно, не очень полезно. Вы не можете подписать метод, связанный с экземпляром объекта, подобным этому, поскольку объект не будет существовать при выполнении определения класса.
Но вы, конечно, можете сделать это:
class Observer:
def on_new_user_registration(self, info, username):
print "new user: %s" % username
o = Observer()
new_user.subscribe(o.on_new_user_registration)
где мы используем границу o.on_new_user_registration
в качестве аргумента для подписки.