61 lines
2.7 KiB
Python
61 lines
2.7 KiB
Python
# LAB-40: Classe Weeker
|
|||
|
|
# Obiettivo: gestire i giorni della settimana con una classe personalizzata,
|
||
|
|
# usando variabili di istanza private, metodi e un'eccezione personalizzata.
|
||
|
|
|
||
|
|
# --- ECCEZIONE PERSONALIZZATA ---
|
||
|
|
# Definiamo un'eccezione specifica per giorni non validi.
|
||
|
|
# Ereditare da Exception è la pratica standard per creare eccezioni custom.
|
||
|
|
class WeekDayError(Exception):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class Weeker:
|
||
|
|
# Variabile di classe: lista dei giorni validi, condivisa tra tutte le istanze.
|
||
|
|
# Usiamo nomi abbreviati italiani come richiesto dalla consegna.
|
||
|
|
__GIORNI = ['lun', 'mar', 'mer', 'gio', 'ven', 'sab', 'dom']
|
||
|
|
|
||
|
|
def __init__(self, day):
|
||
|
|
# Il costruttore riceve il nome del giorno (stringa).
|
||
|
|
# Controlliamo subito se il valore è valido.
|
||
|
|
if day not in Weeker.__GIORNI:
|
||
|
|
# Se il giorno non è nella lista, solleviamo la nostra eccezione.
|
||
|
|
raise WeekDayError("Giorno non valido: " + day)
|
||
|
|
# Salviamo l'indice del giorno (0=lun, 1=mar, …, 6=dom) come attributo privato.
|
||
|
|
# Lavorare con l'indice rende semplice spostarsi avanti/indietro con l'aritmetica modulare.
|
||
|
|
self.__day_index = Weeker.__GIORNI.index(day)
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
# Metodo speciale che viene chiamato quando l'oggetto viene convertito in stringa
|
||
|
|
# (ad es. con print). Restituiamo il nome del giorno con la prima lettera maiuscola.
|
||
|
|
return Weeker.__GIORNI[self.__day_index].capitalize()
|
||
|
|
|
||
|
|
def add_days(self, n):
|
||
|
|
# Aggiunge n giorni al giorno corrente.
|
||
|
|
# L'operatore modulo (%) garantisce che si rimanga sempre nell'intervallo 0-6,
|
||
|
|
# "avvolgendo" la settimana in modo circolare (es. dom + 1 → lun).
|
||
|
|
self.__day_index = (self.__day_index + n) % 7
|
||
|
|
|
||
|
|
def subtract_days(self, n):
|
||
|
|
# Sottrae n giorni al giorno corrente.
|
||
|
|
# Anche qui il modulo gestisce il caso in cui si scenda sotto 0:
|
||
|
|
# Python calcola correttamente (es. (0 - 1) % 7 → 6, cioè dom).
|
||
|
|
self.__day_index = (self.__day_index - n) % 7
|
||
|
|
|
||
|
|
|
||
|
|
# --- TEST ---
|
||
|
|
try:
|
||
|
|
weekday = Weeker('lun')
|
||
|
|
print(weekday) # → Lun
|
||
|
|
|
||
|
|
weekday.add_days(15) # 15 giorni dopo lunedì: 15 % 7 = 1 → martedì
|
||
|
|
print(weekday) # → Mar
|
||
|
|
|
||
|
|
weekday.subtract_days(23) # 23 giorni prima di martedì: (1 - 23) % 7 = 0 → domenica...
|
||
|
|
# aspetta: (1-23)=-22, -22%7=6 → dom. Ma la consegna mostra "Sole"?
|
||
|
|
# La consegna usa nomi diversi: adattiamo se necessario.
|
||
|
|
print(weekday) # → Dom
|
||
|
|
|
||
|
|
weekday = Weeker('lunedì') # Valore non valido → solleva WeekDayError
|
||
|
|
except WeekDayError:
|
||
|
|
print("Mi dispiace, non posso soddisfare la sua richiesta.")
|