Skip to main content
Code update: dictionary instead of list
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = []{} def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback'_observables[event_name] := callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: forif observableself.name in observer._observables:   if observable['name'] == selfobserver.name: observable['callback']_observables[self.name](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Room is ready. Lenard has arrived! 

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables:   if observable['name'] == self.name: observable['callback'](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Room is ready. Lenard has arrived! 

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = {} def observe(self, event_name, callback): self._observables[event_name] = callback class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: if self.name in observer._observables: observer._observables[self.name](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Room is ready. Lenard has arrived! 
minimal
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room createdis ready.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Room is ready. Lenard has arrived! 

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room created.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Lenard has arrived! 

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Room is ready. Lenard has arrived! 
minimal
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148

Here is my take, since I couldn't understand a single thing fromthink people in the other answers. I have not much clue on pattern designs overdo it. The belowYou can easily achieve events in Python with less than 15 lines of code is what feels the most intuitive solution.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer keepsand set to listen (observe) for a list with all observers in your programspecific event. That way wheneverWhen an Event fires it can call ALLEvent is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Any class you want to observe for an event has to inherit Observer and set what kind of event you want to observe. Check the example below:

class Room(Observer): def someone_arrived(self, who): print(who + " has arrived!") # Setting up a room that will observe if someone arrives room = Room() room.observe('someone arrived', room.someone_arrived) # Creating the events Event('someone shouted', 'John') Event('someone arrived', 'Lenard') Event('someone left', 'Maria') 

Output:

Lenard has arrived! 

 

If in your class that inherits Observer you happen to have an initalizer, the Observer's initializer will get overriden. So make sure you call it explicitly as belowExample:

class Room(Observer):   def __init__(self): print("Room created.") Observer.__init__(self) # Make sure Observer's __init__ gets called init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Lenard has arrived! 

Here is my take, since I couldn't understand a single thing from the other answers. I have not much clue on pattern designs. The below code is what feels the most intuitive solution.

You simple have two classes: Event and Observer. Observer keeps a list with all observers in your program. That way whenever an Event fires it can call ALL observers.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Any class you want to observe for an event has to inherit Observer and set what kind of event you want to observe. Check the example below:

class Room(Observer): def someone_arrived(self, who): print(who + " has arrived!") # Setting up a room that will observe if someone arrives room = Room() room.observe('someone arrived', room.someone_arrived) # Creating the events Event('someone shouted', 'John') Event('someone arrived', 'Lenard') Event('someone left', 'Maria') 

Output:

Lenard has arrived! 

 

If in your class that inherits Observer you happen to have an initalizer, the Observer's initializer will get overriden. So make sure you call it explicitly as below:

class Room(Observer):   def __init__(self) print("Room created.") Observer.__init__(self) # Make sure Observer's __init__ gets called  def someone_arrived(self, who): print(who + " has arrived!") 

I think people in the other answers overdo it. You can easily achieve events in Python with less than 15 lines of code.

You simple have two classes: Event and Observer. Any class that wants to listen for an event, needs to inherit Observer and set to listen (observe) for a specific event. When an Event is instantiated and fired, all observers listening to that event will run the specified callback functions.

class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observables = [] def observe(self, event_name, callback): self._observables.append({'name' : event_name, 'callback' : callback}) class Event(): def __init__(self, name, data, autofire = True): self.name = name self.data = data if autofire: self.fire() def fire(self): for observer in Observer._observers: for observable in observer._observables: if observable['name'] == self.name: observable['callback'](self.data) 

Example:

class Room(Observer): def __init__(self): print("Room created.") Observer.__init__(self) # Observer's init needs to be called def someone_arrived(self, who): print(who + " has arrived!") room = Room() room.observe('someone arrived', room.someone_arrived) Event('someone arrived', 'Lenard') 

Output:

Lenard has arrived! 
added 203 characters in body
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148
Loading
added 203 characters in body
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148
Loading
Source Link
Pithikos
  • 20.6k
  • 20
  • 125
  • 148
Loading