-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstudente.py
More file actions
120 lines (97 loc) · 4.49 KB
/
studente.py
File metadata and controls
120 lines (97 loc) · 4.49 KB
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
from persona import Persona
from datetime import datetime
import logging
logger = logging.getLogger(__name__)
class Studente(Persona):
@property
def matricola(self):
return self._matricola
@matricola.setter
def matricola(self, matricola):
self._matricola = matricola
@property
def corso_di_studio(self):
return self._corso_di_studio
@corso_di_studio.setter
def corso_di_studio(self, corso_di_sudtio):
self._corso_di_studio = corso_di_sudtio
@property
def alchool(self):
return self._alchool
@alchool.setter
def alchool(self, alchool):
self._alchool = alchool
@alchool.deleter
def alchool(self):
self._alchool = list()
@property
def esami(self):
return self._esami
@esami.setter
def esami(self, esami):
self._esami = esami
def __init__(self, nome: str, cognome: str, sesso: bool, peso: int, data_di_nascita: datetime, matricola: int,
corso_di_studio: str, alchool: list, esami: dict):
"""
Metodo init per la creazione di uno studente
:param nome: nome dello studente, deve essere di tipo str.
:param cognome: cognome dello studente, deve essere di tipo str.
:param sesso: sesso dello studente, deve essere True per maschio False per le femmina.
:param peso: peso dello studente, deve essere un intero.
:param data_di_nascita: data di nascita dello studente, deve essere di tipo datetime.
:param matricola: matricola dello studente, deve essere un intero.
:param corso_di_studio: cordo di studio dello studente, deve essere una stringa.
:param alchool: lista di bevande consumate dallo studente, deve essere una lista di tuple di lunghezza due, al
primo posto il tasso alcholico della bevanda e al secondo il volume della bevanda e.g. [(14, 200), (30, 50)]
si nota che il primo membro della tupla e` una percentuale quiindi i valori devono essere compresi tra 0 e 100.
:param esami: dizionario degli esami conseguiti dallo studente, il dizionario deve avere come chiave il nome
dell'esame e come valore la tupla (crediti, voto, lode), dove crediti e voto sono interi e il voto deve essere
compreso tra 18 e 30, mentre lode e` un boolean, si nota che la lode non puo` essere assegnata se il voto non
e` 30.
"""
for e in esami.values():
assert isinstance(e, tuple)
assert len(e) == 3
assert isinstance(e[0], int) and isinstance(e[1], int) and isinstance(e[2], bool)
assert 18 <= e[1] <= 30
assert e[1] != 30 and e[3] is True
assert isinstance(nome, str)
assert isinstance(cognome, str)
assert isinstance(data_di_nascita, datetime)
for a in alchool:
assert isinstance(a, tuple)
assert len(a) == 2
assert 0 <= a[0] <= 100
super().__init__(nome, cognome, data_di_nascita, sesso, peso)
self._matricola = matricola
self._corso_di_studio = corso_di_studio
self._alchool = alchool
self._esami = esami
logger.info(f"Studente {self._nome} {self._cognome}, matricola {self._matricola}, iscritto al corso di studio "
f"{self._corso_di_studio}")
def __eq__(self, other):
"""
funziona equal che paragona se due studenti sono uguali usando il numero matricola.
:param other: oggetto di tipo persona
:return: True se i due oggetti Studente hanno la stessa matricola altrimenti False.
"""
return True if self._matricola == other.matricola else False
def __str__(self):
return f"Studente {self._nome} {self._cognome}, matricola {self._matricola}, iscritto al corso di studio " \
f"{self._corso_di_studio}"
def calcolo_media_esami(self):
"""
metodo che calcola la media degli esami.
:return: ritorna la media degli esami.
"""
crediti_totali = sum(map(lambda x: x[0], self._esami.values()))
media = sum(map(lambda x: x[0] * x[1], self._esami.values())) / crediti_totali
return media
def calcola_tasso_alcolemico(self):
"""
metodo che calcola il tasso alcolemico.
:return: ritornoa il tasso alcolemico.
"""
coefficente_difusione = 0.73 if self._sesso else 0.66
sum_beverage = sum(map(lambda x: x[0] * x[1], self._alchool))
return sum_beverage * 0.008 * 1.055 / (coefficente_difusione * self._peso)