Skip to content

Commit b4a65f8

Browse files
committed
Added type hints to observer pattern
1 parent f49d4e9 commit b4a65f8

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

patterns/behavioral/observer.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,61 @@
88
Django Signals: https://docs.djangoproject.com/en/2.1/topics/signals/
99
Flask Signals: http://flask.pocoo.org/docs/1.0/signals/
1010
"""
11+
from __future__ import annotations
12+
13+
from typing import List, Optional, Protocol
14+
15+
16+
# define a generic observer type
17+
class Observer(Protocol):
18+
def update(self, subject: Subject) -> None:
19+
pass
1120

1221

1322
class Subject:
14-
def __init__(self):
15-
self._observers = []
23+
def __init__(self) -> None:
24+
self._observers: List[Observer] = []
1625

17-
def attach(self, observer):
26+
def attach(self, observer: Observer) -> None:
1827
if observer not in self._observers:
1928
self._observers.append(observer)
2029

21-
def detach(self, observer):
30+
def detach(self, observer: Observer) -> None:
2231
try:
2332
self._observers.remove(observer)
2433
except ValueError:
2534
pass
2635

27-
def notify(self, modifier=None):
36+
def notify(self, modifier: Optional[Observer] = None) -> None:
2837
for observer in self._observers:
2938
if modifier != observer:
3039
observer.update(self)
3140

3241

3342
class Data(Subject):
34-
def __init__(self, name=""):
35-
Subject.__init__(self)
43+
def __init__(self, name: str = "") -> None:
44+
super().__init__()
3645
self.name = name
3746
self._data = 0
3847

3948
@property
40-
def data(self):
49+
def data(self) -> int:
4150
return self._data
4251

4352
@data.setter
44-
def data(self, value):
53+
def data(self, value: int) -> None:
4554
self._data = value
4655
self.notify()
4756

4857

4958
class HexViewer:
50-
def update(self, subject):
51-
print(
52-
"HexViewer: Subject {} has data 0x{:x}".format(subject.name, subject.data)
53-
)
59+
def update(self, subject: Data) -> None:
60+
print(f"HexViewer: Subject {subject.name} has data 0x{subject.data:x}")
5461

5562

5663
class DecimalViewer:
57-
def update(self, subject):
58-
print("DecimalViewer: Subject %s has data %d" % (subject.name, subject.data))
64+
def update(self, subject: Data) -> None:
65+
print(f"DecimalViewer: Subject {subject.name} has data {subject.data}")
5966

6067

6168
def main():

0 commit comments

Comments
 (0)