1 of 12

POO in Python

Dott.ssa Denise Angilica

Corso di Sistemi Operativi

Aggiornato all’A.A. 2024-25

2 of 12

Breve recap…

La programmazione a oggetti permette di organizzare il codice in modo simile a come gestiamo gli oggetti nel mondo reale

  • Il codice è organizzato in classi e oggetti, facilitando il riutilizzo in altri progetti o parti del programma.
  • Si evitano duplicazioni, migliorando la manutenzione.
  • Protegge i dati interni degli oggetti nascondendo i dettagli di implementazione.
  • Fornisce un accesso controllato attraverso metodi pubblici (getter/setter).

3 of 12

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}")

4 of 12

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.

5 of 12

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

6 of 12

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}")

7 of 12

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)

8 of 12

Chiariamo eventuali dubbi!

9 of 12

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()

10 of 12

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

11 of 12

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

12 of 12

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