Je souhaite effectuer un enregistrement de rappel unique dans Observer. Je ne veux pas faire l'enregistrement dans init ou dans une autre fonction. Je ne sais pas s'il y a un niveau de classe équivalente initComment faire référence à une méthode de classe en dehors d'un corps de fonction en Python?
class Observer:
@classmethod
def on_new_user_registration(new_user):
#body of handler...
# first I try
NewUserRegistered().subscribe \
(Observer.on_new_user_registration) #gives NameError for Observer
#so I try
NewUserRegistered().subscribe(on_new_user_registration) #says not callable
#neither does this work
NewUserRegistered().subscribe(__metaclass__.on_new_user_registration)
class BaseEvent(object):
_subscriptions = {}
def __init__(self, event_info = None):
self.info = event_info
def fire(self):
for callback in self._subscriptions[event_type]:
callback(event_info)
def subscribe(self, callback):
if not callable(callback):
raise Exception(str(callback) + 'is not callable')
existing = self._subscriptions.get(self.__class__, None)
if not existing:
existing = set()
self._subscriptions[self.__class__] = existing
existing.add(callback)
class NewUserRegistered(BaseEvent):
pass
Quelle version de Python utilisez-vous? Appeler la méthode de classe à l'intérieur de la classe a fonctionné pour moi dans Python 2.5. –
c'est étrange. J'utilise 2.5.1 et votre exemple ci-dessous me donne NameError – ottodidakt
Il peut très bien être un bug dans 2.5.1. Je suppose que cela suffit à vous empêcher d'utiliser ma syntaxe. :-) –