BehavioralPythonverifiedVerified

Observer Pattern in Python

Defines a one-to-many dependency so that when one object changes state, all its dependents are notified and updated automatically.

How to Implement the Observer Pattern in Python

1Step 1: Define the generic event listener type

from typing import Callable, TypeVar

T = TypeVar("T")
Listener = Callable[[T], None]

2Step 2: Create the EventEmitter class with subscribe/unsubscribe

class EventEmitter[T]:
    def __init__(self) -> None:
        self._listeners: list[Listener[T]] = []

    def subscribe(self, listener: Listener[T]) -> Callable[[], None]:
        self._listeners.append(listener)
        return lambda: self.unsubscribe(listener)

    def unsubscribe(self, listener: Listener[T]) -> None:
        self._listeners = [l for l in self._listeners if l is not listener]

    def emit(self, event: T) -> None:
        for listener in self._listeners:
            listener(event)

3Step 3: Define the event data and wire up notifications

from dataclasses import dataclass


@dataclass
class StockUpdate:
    symbol: str
    price: float


stock_feed: EventEmitter[StockUpdate] = EventEmitter()

unsubscribe = stock_feed.subscribe(
    lambda update: print(f"{update.symbol}: ${update.price}")
)

stock_feed.emit(StockUpdate("AAPL", 182.5))
stock_feed.emit(StockUpdate("GOOG", 141.3))

unsubscribe()

stock_feed.emit(StockUpdate("AAPL", 183.0))  # not received

Observer Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Observer Pattern in the Real World

Think of a newspaper subscription service. The publisher (subject) doesn't know exactly who its subscribers (observers) are—it just maintains a list. When a new edition is printed, it delivers a copy to every subscriber on the list automatically. Subscribers can cancel at any time without the publisher needing to change anything.