POO in Python
Dott.ssa Denise Angilica
Corso di Sistemi Operativi
Aggiornato all’A.A. 2024-25
Breve recap…
La programmazione a oggetti permette di organizzare il codice in modo simile a come gestiamo gli oggetti nel mondo reale
Classi
C++
class Persona {
public:
std::string nome;
int eta;
Persona(std::string n, int e) : nome(n), eta(e) {}
void stampaInfo() {
std::cout << "Nome: " << nome << ", Età: " << eta << std::endl;
}
};
Python
class Persona:
def __init__(self, nome, eta):
self.nome = nome
self.eta = eta
def stampa_info(self):
print(f"Nome: {self.nome}, Età: {self.eta}")
self
`self` è un riferimento all'istanza corrente della classe. Viene usato per accedere a variabili e metodi associati all'istanza corrente. Ogni metodo di un oggetto che opera su dati dell'oggetto stesso deve avere `self` come primo parametro, anche se questo non viene passato esplicitamente quando il metodo è chiamato.
Non è possibile evitare di scrivere `self.` quando si accede o si modificano gli attributi dell'istanza perché è così che Python distingue tra variabili di istanza, locali e globali.
Le variabili statiche di classe
class Studente:
numero_studenti = 0 # Variabile statica di classe
def __init__(self, nome):
self.nome = nome
Studente.numero_studenti += 1
print(Studente.numero_studenti) # 0
studente1 = Studente("Mario")
studente2 = Studente("Luigi")
print(studente1.numero_studenti) # 2, accesso tramite istanza
print(Studente.numero_studenti) # 2, accesso tramite nome della classe
Ereditarietà
C++
class Studente : public Persona {
public:
std::string corso;
Studente(std::string n, int e, std::string c) : Persona(n, e), corso(c) {}
void stampaInfo() {
Persona::stampaInfo();
std::cout << "Corso: " << corso << std::endl;
}
};
Python
class Studente(Persona):
def __init__(self, nome, eta, corso):
super().__init__(nome, eta)
self.corso = corso
def stampa_info(self):
super().stampa_info()
print(f"Corso: {self.corso}")
Python e il Duck Typing
“If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck”
class Anatra:
def quack(self):
print("Quack, quack!")
class Persona:
def quack(self):
print("L'uomo imita un'anatra quack, quack!")
def fa_quack(oggetto):
oggetto.quack()
anatra = Anatra()
persona = Persona()
# Entrambi gli oggetti possono essere passati a fa_quack
fa_quack(anatra)
fa_quack(persona)
Chiariamo eventuali dubbi!
Che errore c’è in questo codice?
class Persona:
def __init__(self, nome):
self.nome=nome
def presentati(self):
print(f"Ciao sono {self.nome}")
class Studente(Persona):
def __init__(self, nome, matricola):
super().__init__(nome)
self.matricola=matricola
def presentati(self):
super().presentati()
print(f"La mia matricola è {self.matricola}")
pippo = Studente("Pippo")
pippo.presentati()
class Persona:
def __init__(self, nome):
self.nome=nome
def presentati(self):
print(f"Ciao sono {self.nome}")
class Studente(Persona):
def __init__(self, nome, matricola):
super().__init__(nome)
self.matricola=matricola
def presentati(self):
super().presentati()
print(f"La mia matricola è {self.matricola}")
pippo = Studente("Pippo",123456)
pippo.presentati()
E quindi ora cosa stampa?
class Persona:
def __init__(self, nome):
self.nome=nome
def presentati(self):
print(f"Ciao sono {self.nome}")
class Studente(Persona):
def __init__(self, nome, matricola):
super().__init__(nome)
self.matricola=matricola
def presentati(self):
super().presentati()
print(f"La mia matricola è {self.matricola}")
pippo = Studente("Pippo",123456)
pippo.presentati()
Ciao sono Pippo
La mia matricola è 123456
Qui abbiamo problemi?
class Persona:
def __init__(self, nome):
self.nome=nome
def presentati(self):
print(f"Ciao sono {self.nome}")
class Studente(Persona):
def __init__(self, nome, matricola=0):
super().__init__(nome)
self.matricola=matricola
def presentati(self):
print(f"La mia matricola è {self.matricola}")
pippo = Studente("Pippo")
pippo.presentati()
No, semplicemente stamperà:
La mia matricola è 0
Adesso a voi la palla.
Inquadra il QR code. Troverai delle classi C++. Il tuo compito è quello di riscriverle in Python.
NON USARE CHATGPT.
Sei qui per imparare, io sono qui per aiutarti.
���https://shorturl.at/UuPBX