-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtestObservedStudents.py
139 lines (106 loc) · 4.26 KB
/
testObservedStudents.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import collections
import datetime
import itertools
import sys
import time
Exam = collections.namedtuple("Exam", "name cfu")
class HistoryView:
def __init__(self):
self.data = []
def update(self, model):
self.data.append((model.grades.copy(),model.english_r,time.time()))
class LiveView:
def __init__(self):
self.english = False
self.esami = {}
def update(self, model):
if model.english_r and not self.english:
self.english = True
print("Cambio stato: lo studente ha appena superato la prova di Inglese\n")
if model.esame is not None and self.esami.get(model.esame.name) is None :
self.esami.update({model.esame.name : model.esame.cfu})
print("Cambio stato: lo studente ha superato un nuovo esame")
print("Cambio stato: il numero di CFU e`: ",model.total_cfu, "\n")
class Observed:
def __init__(self):
self.__observers = set()
def observers_add(self, observer, *observers):
for observer in itertools.chain((observer,), observers):
self.__observers.add(observer)
observer.update(self)
def observer_discard(self, observer):
self.__observers.discard(observer)
def observers_notify(self):
for observer in self.__observers:
observer.update(self)
class LaureaT_Student(Observed):
def __init__(self, total_cfu):
super().__init__()
self._total_cfu = self._esame= None
self._english_r = False
self._grades = {}
self.total_cfu=total_cfu
@property
def total_cfu(self):
return self._total_cfu
@total_cfu.setter
def total_cfu(self, value):
if self._total_cfu != value:
self._total_cfu = value
self.observers_notify()
@property
def english_r(self):
return self._english_r
@english_r.setter
def english_r(self, value):
if self._english_r != value:
self._english_r = value
self.observers_notify()
@property
def grades(self):
return self._grades
def add_grade(self, esame, voto):
self.esame=esame
self._grades.update({esame.name:voto})
self.observers_notify()
@property
def esame(self):
return self._esame
@esame.setter
def esame(self, value):
self._esame=value
self.total_cfu+=value.cfu
def main():
historyView = HistoryView()
liveView = LiveView()
student = LaureaT_Student(0)
student.observers_add(historyView, liveView)
print("Lo studente sta per superare analisi matematica")
student.add_grade(Exam("analisi matematica", 9), 28)
print("Lo studente sta per superare asistemi operativi")
student.add_grade(Exam("sistemi operativi", 6), 20)
print("Lo studente sta per superare la prova di Inglese")
student.english_r = True
for grades, flag, timestamp in historyView.data:
print("Esami: {}, Inglese: {}, Data: {}".format(grades,
" " if flag == None else "superato" if flag else "non superato",
datetime.datetime.fromtimestamp(timestamp)), file=sys.stderr)
if __name__ == "__main__":
main()
"""
Il programma stampa:
Lo studente sta per superare analisi matematica
Cambio stato: lo studente ha superato un nuovo esame
Cambio stato: il numero di CFU e` : 9
Lo studente sta per superare a sistemi operativi
Cambio stato: lo studente ha superato un nuovo esame
Cambio stato: il numero di CFU e` : 15
Lo studente sta per superare la prova di Inglese
Cambio stato: lo studente ha appena superato la prova di Inglese
Esami: {}, Inglese: non superato, Data: 2022-11-21 22:26:12.713307
Esami: {'analisi matematica': 28}, Inglese: non superato, Data: 2022-11-21 22:26:12.756684
Esami: {'analisi matematica': 28}, Inglese: non superato, Data: 2022-11-21 22:26:12.889491
Esami: {'analisi matematica': 28, 'sistemi operativi': 20}, Inglese: non superato, Data: 2022-11-21 22:26:12.923176
Esami: {'analisi matematica': 28, 'sistemi operativi': 20}, Inglese: non superato, Data: 2022-11-21 22:26:13.075015
Esami: {'analisi matematica': 28, 'sistemi operativi': 20}, Inglese: superato, Data: 2022-11-21 22:26:13.107723
"""