Package pypat :: Package behavioral :: Module observer
[hide private]
[frames] | no frames]

Source Code for Module pypat.behavioral.observer

 1  from abc import ABCMeta, abstractmethod 
2 3 4 -class Observer(object, metaclass=ABCMeta):
5 """ 6 Abstract Observer class as part of the Observer design pattern. 7 8 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Behavioral-Pattern-Usage} 9 - External Observer Pattern documentation: U{https://en.wikipedia.org/wiki/Observer_pattern} 10 """ 11 @abstractmethod
12 - def update(self, **state):
13 """ 14 Abstract method that is called when an Observable's state changes. 15 """ 16 pass
17
18 19 -class Observable(object):
20 """ 21 Base Observable class as part of the Observer design pattern. 22 23 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Behavioral-Pattern-Usage} 24 - External Observer Pattern documentation: U{https://en.wikipedia.org/wiki/Observer_pattern} 25 """
26 - def __init__(self):
27 """ 28 Initialize a new Observable instance. 29 """ 30 self._observers = set()
31
32 - def attach(self, observer):
33 """ 34 Attach an observer to this Observable. 35 36 @param observer: The Observer to attach. 37 @type observer: Observer 38 """ 39 self._observers.add(observer)
40
41 - def detach(self, observer):
42 """ 43 Detach an observer from this Observable. 44 45 @param observer: The Observer to detach. 46 @type observer: Observer 47 """ 48 try: 49 self._observers.remove(observer) 50 except KeyError: 51 pass
52
53 - def notify(self):
54 """ 55 Notify all attached Observers of the state of this Observable. 56 """ 57 for observer in self._observers: 58 state = {k: v for k, v in self.__dict__.items() if not k.startswith('__') and not k.startswith('_')} 59 observer.update(**state)
60