Classi e oggetti
A cosa servono classi e oggetti
Sezione intitolata “A cosa servono classi e oggetti”Per gestire 30 studenti con sole variabili separate avresti nomi come nome1, eta1, voto1, nome2, eta2, voto2… I dati diventerebbero difficili da organizzare.
Le classi raggruppano dati e funzioni correlate. Gli oggetti sono le singole istanze create a partire da una classe.
La differenza tra classe e oggetto
Sezione intitolata “La differenza tra classe e oggetto”Una classe è come il progetto di un’automobile: descrive la struttura dell’auto, ma non è un’auto concreta.
Un oggetto è un’automobile vera, costruita seguendo quel progetto.
Dallo stesso progetto puoi costruire molti oggetti, ciascuno con il proprio colore, la propria targa e il proprio chilometraggio.
Definire una classe
Sezione intitolata “Definire una classe”class Persona: pass # "pass" significa: classe vuota per ora, aggiungeremo cose dopoIl costruttore: __init__
Sezione intitolata “Il costruttore: __init__”Il metodo __init__ è il costruttore: viene eseguito quando crei un oggetto e imposta i suoi dati iniziali.
class Persona: def __init__(self, nome, eta): # "self" è l'oggetto che stiamo creando # self.nome e self.eta sono i dati dell'oggetto (chiamati "attributi") self.nome = nome self.eta = etaself è un riferimento all’oggetto stesso. È il primo parametro di ogni metodo, anche se non lo scrivi quando chiami il metodo.
Creare oggetti (istanze)
Sezione intitolata “Creare oggetti (istanze)”alice = Persona("Alice", 16) # Crea una Persona con nome="Alice" e eta=16bob = Persona("Bob", 17) # Crea una Persona diversa
# Accedere ai dati dell'oggetto con il puntoprint(alice.nome) # Aliceprint(bob.eta) # 17alice e bob sono due istanze della classe Persona. Hanno gli stessi attributi, ma valori diversi.
Aggiungere metodi
Sezione intitolata “Aggiungere metodi”I metodi sono funzioni definite dentro una classe. Descrivono le azioni dell’oggetto.
class Persona: def __init__(self, nome, eta): self.nome = nome self.eta = eta
def saluta(self): # Questo metodo usa i dati dell'oggetto (self.nome, self.eta) print(f"Ciao, mi chiamo {self.nome} e ho {self.eta} anni.")
def compleanno(self): # Questo metodo modifica un dato dell'oggetto self.eta += 1 print(f"Buon compleanno {self.nome}! Ora hai {self.eta} anni.")
alice = Persona("Alice", 16)alice.saluta() # → Ciao, mi chiamo Alice e ho 16 anni.alice.compleanno() # → Buon compleanno Alice! Ora hai 17 anni.alice.saluta() # → Ciao, mi chiamo Alice e ho 17 anni.Attributi di classe vs attributi di istanza
Sezione intitolata “Attributi di classe vs attributi di istanza”- Attributi di istanza: appartengono al singolo oggetto (ogni oggetto ha il suo valore)
- Attributi di classe: sono condivisi da tutti gli oggetti della classe (come una bacheca comune)
class Studente: scuola = "Liceo Scientifico" # Attributo di classe: uguale per tutti
def __init__(self, nome): self.nome = nome # Attributo di istanza: diverso per ciascuno
alice = Studente("Alice")bob = Studente("Bob")
print(alice.scuola) # Liceo Scientificoprint(bob.scuola) # Liceo Scientifico ← stesso valore per tuttiprint(alice.nome) # Aliceprint(bob.nome) # Bob ← valore diverso per ciascunoIl metodo __str__: come stampare un oggetto
Sezione intitolata “Il metodo __str__: come stampare un oggetto”Senza una definizione specifica, print(alice) mostra un testo come <__main__.Persona object at 0x...>. Il metodo speciale __str__ definisce la rappresentazione da stampare.
class Persona: def __init__(self, nome, eta): self.nome = nome self.eta = eta
def __str__(self): # Questo viene usato da print() e str() return f"Persona(nome={self.nome}, eta={self.eta})"
alice = Persona("Alice", 16)print(alice) # → Persona(nome=Alice, eta=16)Esempio completo: la classe Rettangolo
Sezione intitolata “Esempio completo: la classe Rettangolo”class Rettangolo: def __init__(self, base, altezza): self.base = base self.altezza = altezza
def area(self): # Calcola l'area: base × altezza return self.base * self.altezza
def perimetro(self): # Calcola il perimetro: 2 × (base + altezza) return 2 * (self.base + self.altezza)
def __str__(self): return f"Rettangolo {self.base}×{self.altezza}"
r = Rettangolo(5, 3)print(r) # → Rettangolo 5×3print(r.area()) # → 15print(r.perimetro()) # → 16
# Puoi creare più rettangoli indipendentir2 = Rettangolo(10, 4)print(r2.area()) # → 40Ogni rettangolo è un oggetto indipendente: modificare r non influisce su r2.