PYTHON · 객체지향
옵저버 패턴
옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.
객체지향고급observer옵저버event이벤트
핵심 설명
옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.
Python code
from typing import Callable, Any
class EventEmitter:
def __init__(self):
self._listeners: dict[str, list[Callable]] = {}
def on(self, event: str, callback: Callable):
self._listeners.setdefault(event, []).append(callback)
def off(self, event: str, callback: Callable):
if event in self._listeners:
self._listeners[event].remove(callback)
def emit(self, event: str, *args: Any, **kwargs: Any):
for cb in self._listeners.get(event, []):
cb(*args, **kwargs)
# 사용 예: 주문 시스템
class OrderSystem(EventEmitter):
def place_order(self, item: str, qty: int):
print(f"주문 접수: {item} x {qty}")
self.emit("order_placed", item=item, qty=qty)
# 옵저버(리스너) 등록
shop = OrderSystem()
shop.on("order_placed",
lambda **kw: print(f" [재고] {kw['item']} {kw['qty']}개 차감"))
shop.on("order_placed",
lambda **kw: print(f" [알림] {kw['item']} 주문 알림 발송"))
shop.on("order_placed",
lambda **kw: print(f" [로그] 주문 기록 저장"))
shop.place_order("노트북", 2)학습 팁
약한 참조(weakref)를 사용하면 옵저버가 가비지 컬렉션되었을 때 자동으로 해제됩니다.
주의할 점
옵저버 콜백에서 예외가 발생하면 나머지 옵저버가 호출되지 않습니다. try/except로 각 콜백을 보호하세요.
자주 묻는 질문
옵저버 패턴란 무엇인가요?
옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.
옵저버 패턴 학습 시 주의할 점은 무엇인가요?
옵저버 콜백에서 예외가 발생하면 나머지 옵저버가 호출되지 않습니다. try/except 로 각 콜백을 보호하세요.