# 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.")