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
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.
fido.abbaia()
# equivalente a Cane.abbaia(fido)
# Python passa fido come self automaticamenteAttributi di istanza vs di classe
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
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 # 0Variabili 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
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()`.
Mostra suggerimento
math.sqrt(self.x ** 2 + self.y ** 2)
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
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`.
Mostra suggerimento
self.balance += amount nel deposit.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
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()`.
Mostra suggerimento
Ricorda di usare self per accedere agli attributi all'interno di area(self).
Soluzione disponibile dopo 3 tentativi