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
13 """
14 Abstract method that is called when an Observable's state changes.
15 """
16 pass
17
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 """
27 """
28 Initialize a new Observable instance.
29 """
30 self._observers = set()
31
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
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
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