Ich möchte eine einmalige Rückrufregistrierung innerhalb von Observer durchführen. Ich möchte die Registrierung innerhalb von init oder anderen Funktionen nicht machen. Ich weiß nicht, ob es eine Klassenstufe Äquivalent für init istWie referenziere ich eine Klassenmethode außerhalb eines Funktionskörpers in 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
Welche Version von Python verwenden Sie? Der Aufruf der Klassenmethode innerhalb der Klasse funktionierte für mich in Python 2.5. –
das ist seltsam. Ich verwende 2.5.1 und Ihr Beispiel unten gibt mir NameError – ottodidakt
Es kann sehr gut ein Fehler in 2.5.1 sein. Ich nehme an, das ist genug, um zu verhindern, dass Sie meine Syntax verwenden. :-) –