Skip to content

Commit abb3910

Browse files
Observer Patterns
1 parent dbf79d5 commit abb3910

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Event(list):
2+
def __call__(self, *args, **kwargs):
3+
for item in self:
4+
item(*args, **kwargs)
5+
6+
7+
class Person:
8+
def __init__(self, name, address):
9+
self.name = name
10+
self.address = address
11+
self.falls_ill = Event()
12+
13+
def catch_a_cold(self):
14+
self.falls_ill(self.name, self.address)
15+
16+
17+
def call_doctor(name, address):
18+
print(f'A doctor has been called to {address}')
19+
20+
if __name__ == '__main__':
21+
person = Person('Sherlock', '221B Baker St')
22+
23+
person.falls_ill.append(lambda name, addr: print(f'{name} is ill'))
24+
25+
person.falls_ill.append(call_doctor)
26+
27+
person.catch_a_cold()
28+
29+
# and you can remove subscriptions too
30+
person.falls_ill.remove(call_doctor)
31+
person.catch_a_cold()
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class Event(list):
2+
def __call__(self, *args, **kwargs):
3+
for item in self:
4+
item(*args, **kwargs)
5+
6+
7+
class PropertyObservable:
8+
def __init__(self):
9+
self.property_changed = Event()
10+
11+
12+
class Person(PropertyObservable):
13+
def __init__(self, age=0):
14+
super().__init__()
15+
self._age = age
16+
17+
@property
18+
def age(self):
19+
return self._age
20+
21+
@age.setter
22+
def age(self, value):
23+
if self._age == value:
24+
return
25+
self._age = value
26+
self.property_changed('age', value)
27+
28+
29+
class TrafficAuthority:
30+
def __init__(self, person):
31+
self.person = person
32+
person.property_changed.append(self.person_changed)
33+
34+
def person_changed(self, name, value):
35+
if name == 'age':
36+
if value < 16:
37+
print('Sorry, you still cannot drive')
38+
else:
39+
print('Okay, you can drive now')
40+
self.person.property_changed.remove(
41+
self.person_changed
42+
)
43+
44+
45+
if __name__ == '__main__':
46+
p = Person()
47+
ta = TrafficAuthority(p)
48+
for age in range(14, 20):
49+
print(f'Setting age to {age}')
50+
p.age = age
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
class Event(list):
2+
def __call__(self, *args, **kwargs):
3+
for item in self:
4+
item(*args, **kwargs)
5+
6+
7+
class PropertyObservable:
8+
def __init__(self):
9+
self.property_changed = Event()
10+
11+
12+
class Person(PropertyObservable):
13+
def __init__(self, age=0):
14+
super().__init__()
15+
self._age = age
16+
17+
@property
18+
def can_vote(self):
19+
return self._age >= 18
20+
21+
@property
22+
def age(self):
23+
return self._age
24+
25+
# @age.setter
26+
# def age(self, value):
27+
# if self._age == value:
28+
# return
29+
# self._age = value
30+
# self.property_changed('age', value)
31+
32+
@age.setter
33+
def age(self, value):
34+
if self._age == value:
35+
return
36+
37+
old_can_vote = self.can_vote
38+
39+
self._age = value
40+
self.property_changed('age', value)
41+
42+
if old_can_vote != self.can_vote:
43+
self.property_changed('can_vote', self.can_vote)
44+
45+
46+
if __name__ == '__main__':
47+
def person_changed(name, value):
48+
if name == 'can_vote':
49+
print(f'Voting status changed to {value}')
50+
51+
p = Person()
52+
p.property_changed.append(
53+
person_changed
54+
)
55+
56+
for age in range(16, 21):
57+
print(f'Changing age to {age}')
58+
p.age = age

0 commit comments

Comments
 (0)