Salta ai contenuti
Manuale LogoManuale Logo

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.

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.

class Persona:
pass # "pass" significa: classe vuota per ora, aggiungeremo cose dopo

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 = eta

self è un riferimento all’oggetto stesso. È il primo parametro di ogni metodo, anche se non lo scrivi quando chiami il metodo.

alice = Persona("Alice", 16) # Crea una Persona con nome="Alice" e eta=16
bob = Persona("Bob", 17) # Crea una Persona diversa
# Accedere ai dati dell'oggetto con il punto
print(alice.nome) # Alice
print(bob.eta) # 17

alice e bob sono due istanze della classe Persona. Hanno gli stessi attributi, ma valori diversi.

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 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 Scientifico
print(bob.scuola) # Liceo Scientifico ← stesso valore per tutti
print(alice.nome) # Alice
print(bob.nome) # Bob ← valore diverso per ciascuno

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)
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×3
print(r.area()) # → 15
print(r.perimetro()) # → 16
# Puoi creare più rettangoli indipendenti
r2 = Rettangolo(10, 4)
print(r2.area()) # → 40

Ogni rettangolo è un oggetto indipendente: modificare r non influisce su r2.