Gestionale di un catalogo di libri in Python, costruito su due classi che si compongono e su un uso esteso dei metodi speciali del linguaggio.
Progetto realizzato come prova finale del modulo Programmazione 2, all'interno del percorso formativo Web Developer AI presso la Steve Jobs Academy (Catania).
Fa parte di una serie di quattro progetti finali del modulo. Gli altri sono pokemon-api-client, creature-manager e loan-predictor-ml.
Il progetto modella due entità distinte che si compongono: un libro, con i suoi dati, e un catalogo, che raccoglie più libri e ne conosce il valore complessivo.
La scelta di separarle non è formale. Il catalogo non è una semplice lista: deve mantenere aggiornato il proprio valore totale a ogni aggiunta o rimozione, e deve poter essere confrontato o unito a un altro catalogo. Sono responsabilità che appartengono al catalogo, non ai libri che contiene.
Rappresenta un singolo libro: titolo, autore, casa editrice e prezzo.
Il prezzo è dichiarato con il doppio underscore:
self.__price = priceNon è una convenzione estetica. Il doppio underscore attiva il name mangling di Python, che rende l'attributo inaccessibile dall'esterno con il suo nome originale. L'unico modo per leggerlo o modificarlo è passare dai metodi previsti.
def set_price(self, new_price):
if new_price > 0:
self.__price = new_price
else:
print("Error, the price must be a positive value")Il setter esiste proprio per questo: impone che il prezzo resti positivo. Se l'attributo fosse pubblico, chiunque potrebbe assegnargli un valore negativo e il controllo non servirebbe a nulla.
Raccoglie una lista di libri e mantiene aggiornato il proprio valore totale, anch'esso privato.
Ogni volta che un libro viene aggiunto o rimosso, il totale viene ricalcolato. In questo modo il valore non deve essere ricalcolato scorrendo tutta la lista a ogni richiesta: è sempre corretto.
Le due classi ridefiniscono i metodi con doppio underscore per integrarsi con la sintassi nativa di Python.
| Metodo | Classe | Effetto |
|---|---|---|
__str__ |
Book, Catalog |
Definisce cosa mostra print() sull'oggetto |
__eq__ |
Catalog |
Ridefinisce l'operatore == |
__add__ |
Catalog |
Ridefinisce l'operatore + |
Senza questo metodo, == confronterebbe gli indirizzi in memoria: due cataloghi identici nel contenuto risulterebbero diversi solo perché sono due oggetti distinti.
Qui il confronto avviene su nome e descrizione, che sono i dati che identificano davvero un catalogo.
unified = fantasy + classicsIl metodo crea un terzo catalogo con un nome composto, unisce le due liste di libri e somma i valori totali. I cataloghi originali restano intatti.
È l'esempio più chiaro di cosa permettono i metodi speciali: un'operazione complessa espressa con un singolo simbolo, che si legge come se fosse una somma tra numeri.
- Incapsulamento — attributi privati con doppio underscore, accesso tramite getter e setter
- Validazione nel setter — il prezzo non può essere negativo
- Composizione tra classi —
Catalogcontiene oggettiBook - Metodi speciali —
__str__,__eq__,__add__ - Stato derivato mantenuto aggiornato — il valore totale si aggiorna a ogni operazione
Nessuna dipendenza esterna oltre alla libreria standard.
python main.py
Lo script contiene una dimostrazione che esercita tutte le funzionalità: creazione dei libri, modifica del prezzo con e senza valori validi, creazione di due cataloghi, rimozione di un libro, unione con + e confronto con ==.
- Aggiungere
__eq__aBook. Attualmenteremove_bookusalist.remove(), che confronta gli oggetti per identità: rimuove il libro solo se gli si passa esattamente lo stesso oggetto. Con__eq__definito su titolo e autore, funzionerebbe anche con un libro equivalente creato separatamente. - Persistenza dei dati. Il catalogo vive in memoria e si perde alla chiusura. Il salvataggio su file JSON sarebbe lo sviluppo naturale.
- Ricerca e ordinamento. Cercare un libro per autore o ordinare il catalogo per prezzo sono le funzioni che mancano per prime.
- Interfaccia utente. Un menu interattivo, o una versione web, renderebbe il gestionale utilizzabile senza modificare il codice.
- Python 3 — libreria standard
- Visual Studio Code come ambiente di sviluppo
Riccardo Mazza — @Richard-WebDev Studente Web Developer AI, Steve Jobs Academy