CHI HA PAURA DELL’INTELLIGENZA ARTIFICIALE?
7. Programmazione a Oggetti (OOP)
Obiettivi didattici:
Comprendere i concetti di classe e oggetto.
Imparare a definire attributi e metodi.
Approfondire ereditarietà e polimorfismo.
Applicare la OOP per simulazioni pratiche (es. conto bancario).
La OOP è un paradigma che organizza il codice attorno a oggetti che rappresentano entità reali o concettuali.
Ogni oggetto ha:
Attributi: caratteristiche/variabili dello stato dell’oggetto.
Metodi: funzioni che descrivono i comportamenti dell’oggetto.
Vantaggi:
Incapsulamento (stato e comportamenti insieme).
Riutilizzabilità (ereditarietà).
Estendibilità e manutenzione più facile.
Definizione di classe: modello o blueprint per creare oggetti.
class Persona:
def __init__(self, nome, eta):
self.nome = nome
self.eta = eta
def saluta(self):
print(f"Ciao, mi chiamo {self.nome} e ho {self.eta} anni.")
Creazione di oggetti:
p1 = Persona("Mario", 30)
p2 = Persona("Luisa", 25)
p1.saluta() # Ciao, mi chiamo Mario e ho 30 anni.
p2.saluta() # Ciao, mi chiamo Luisa e ho 25 anni.
Spiegazione:
__init__ è il costruttore, viene eseguito alla creazione dell’oggetto.
self rappresenta l’oggetto stesso.
Attributi: self.nome, self.eta.
Metodi: saluta().
Attributi di istanza: specifici per ogni oggetto (self.nome).
Attributi di classe: condivisi da tutti gli oggetti (Classe.nome_attr).
Esempio attributo di classe:
class Studente:
universita = "Politecnico" # attributo di classe condiviso
def __init__(self, nome):
self.nome = nome # attributo di istanza
s1 = Studente("Anna")
s2 = Studente("Luca")
print(s1.universita) # Politecnico
print(s2.universita) # Politecnico
Permette di creare sottoclassi che ereditano attributi e metodi di una superclasse.
class Animale:
def __init__(self, nome):
self.nome = nome
def parla(self):
pass # metodo generico
class Cane(Animale):
def parla(self):
print(f"{self.nome} dice Bau!")
class Gatto(Animale):
def parla(self):
print(f"{self.nome} dice Miao!")
c = Cane("Fido")
g = Gatto("Micio")
c.parla() # Fido dice Bau!
g.parla() # Micio dice Miao!
Polimorfismo: oggetti di classi diverse rispondono allo stesso metodo (parla) in modi differenti.
Obiettivo: creare una classe ContoBancario con deposito, prelievo e saldo.
class ContoBancario:
def __init__(self, titolare, saldo_iniziale=0):
self.titolare = titolare
self.saldo = saldo_iniziale
def deposita(self, importo):
self.saldo += importo
print(f"Depositati {importo}€. Saldo attuale: {self.saldo}€")
def preleva(self, importo):
if importo <= self.saldo:
self.saldo -= importo
print(f"Prelevati {importo}€. Saldo attuale: {self.saldo}€")
else:
print("Fondi insufficienti!")
def mostra_saldo(self):
print(f"Saldo attuale di {self.titolare}: {self.saldo}€")
Utilizzo della classe:
conto1 = ContoBancario("Mario Rossi", 1000)
conto1.deposita(500) # Depositati 500€. Saldo attuale: 1500€
conto1.preleva(200) # Prelevati 200€. Saldo attuale: 1300€
conto1.mostra_saldo() # Saldo attuale di Mario Rossi: 1300€
class ContoRisparmio(ContoBancario):
def __init__(self, titolare, saldo_iniziale=0, interesse=0.02):
super().__init__(titolare, saldo_iniziale)
self.interesse = interesse
def applica_interesse(self):
self.saldo += self.saldo * self.interesse
print(f"Interesse applicato. Nuovo saldo: {self.saldo}€")
conto2 = ContoRisparmio("Luisa Bianchi", 1000)
conto2.applica_interesse() # Interesse applicato. Nuovo saldo: 1020.0€
Spiegazione:
super().__init__() richiama il costruttore della superclasse.
La sottoclasse aggiunge nuovi attributi/metodi (interesse, applica_interesse).
Polimorfismo: possiamo trattare ContoBancario e ContoRisparmio in modo simile per operazioni comuni.
Cos’è un oggetto?
Risposta: istanza di una classe, con attributi e metodi.
Cos’è un metodo?
Risposta: funzione definita all’interno di una classe che opera sugli attributi dell’oggetto.
Differenza tra attributo di istanza e di classe?
Risposta: Istanza → specifico per ogni oggetto; Classe → condiviso da tutti gli oggetti.
Cosa permette l’ereditarietà?
Risposta: creare classi figlie che ereditano attributi e metodi di una classe genitore.
Cos’è il polimorfismo?
Risposta: oggetti di classi diverse rispondono allo stesso metodo in modi differenti.
Creare una classe Veicolo con metodi accelera e frena.
Creare sottoclassi Auto e Bicicletta, implementando metodi specifici.
Simulare il movimento e stampare lo stato di ogni veicolo.
Bonus: aggiungere attributi come carburante o cambio e gestirli con metodi dedicati.
Commenti
Posta un commento