File tree Expand file tree Collapse file tree 3 files changed +139
-0
lines changed
src/1_patterns/4_BehavioralPatterns/7_Observer Expand file tree Collapse file tree 3 files changed +139
-0
lines changed Original file line number Diff line number Diff line change
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 ()
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments