Vai al contenuto
eLearner.app
Modulo 7 · Lezione 1 di 425/36 nel corso~14 min
Lezioni del modulo (1/4)

Classi e istanze

Una classe è uno schema per creare oggetti che hanno dati (attributi) e comportamento (metodi). Un'istanza è un oggetto concreto creato dalla classe.

Sintassi minima

Python
class Cane:
    def __init__(self, nome, eta):
        self.nome = nome
        self.eta = eta

    def abbaia(self):
        return f"{self.nome} dice WOOF!"

# creazione di istanze
fido = Cane("Fido", 3)
luna = Cane("Luna", 5)

fido.nome       # 'Fido'
fido.abbaia()   # 'Fido dice WOOF!'

__init__: il "costruttore"

Il metodo __init__ viene chiamato automaticamente quando crei un'istanza (Cane("Fido", 3)). Serve a inizializzare gli attributi.

Tecnicamente non è un costruttore (l'oggetto è già stato creato da __new__), ma è il punto in cui setti lo stato iniziale.

self: il primo parametro

self è il riferimento all'istanza su cui il metodo è stato chiamato. È convenzione (non parola chiave) ed è sempre il primo parametro dei metodi di istanza.

Python
fido.abbaia()
# equivalente a Cane.abbaia(fido)
# Python passa fido come self automaticamente

Attributi di istanza vs di classe

Python
class Cane:
    specie = "Canis familiaris"   # attributo di CLASSE (condiviso)

    def __init__(self, nome):
        self.nome = nome           # attributo di ISTANZA (per ognuno)

fido = Cane("Fido")
luna = Cane("Luna")

fido.nome       # 'Fido'        (istanza)
luna.nome       # 'Luna'        (istanza)
fido.specie     # 'Canis familiaris'  (cercato sulla classe)
Cane.specie     # 'Canis familiaris'

Metodi multipli e stato

Python
class Contatore:
    def __init__(self, inizio=0):
        self.valore = inizio

    def incrementa(self, di=1):
        self.valore += di

    def reset(self):
        self.valore = 0

c = Contatore()
c.incrementa()
c.incrementa(di=5)
c.valore       # 6
c.reset()
c.valore       # 0

Variabili di classe vs Variabili di istanza

Le variabili definite all'interno di una classe ma fuori dai metodi sono variabili di classe: sono condivise da tutte le istanze di quella classe. Le variabili definite all'interno di __init__ con il prefisso self. sono invece variabili di istanza ed appartengono esclusivamente a ciascun singolo oggetto creato.

Prova tu

Esercizio#python.m7.l1.e1
Tentativi: 0Caricamento…

Definisci una classe `Point` con __init__(self, x, y) che salva gli attributi. Aggiungi un metodo `distance_from_origin` che restituisce la radice quadrata di x^2 + y^2. Crea `p = Point(3, 4)` e valuta `p.distance_from_origin()`.

Caricamento editor…
Mostra suggerimento

math.sqrt(self.x ** 2 + self.y ** 2)

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m7.l1.e2
Tentativi: 0Caricamento…

Definisci `BankAccount` con __init__(self, balance=0) e metodi `deposit(amount)`, `withdraw(amount)` che modificano self.balance. Crea `a = BankAccount(100)`, deposit 50, withdraw 30. Valuta `a.balance`.

Caricamento editor…
Mostra suggerimento

self.balance += amount nel deposit.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m7.l1.e3
Tentativi: 0Caricamento…

Definisci una classe `Rectangle` che abbia un costruttore `__init__(self, width, height)` per impostare larghezza ed altezza, ed un metodo `area(self)` che restituisca il prodotto di larghezza e altezza. Istanzia un rettangolo con larghezza `4` e altezza `5` salvandolo in `rect`, e valuta la chiamata `rect.area()`.

Caricamento editor…
Mostra suggerimento

Ricorda di usare self per accedere agli attributi all'interno di area(self).

Soluzione disponibile dopo 3 tentativi