2.20. First class¶
Una classe raggruppa dei dati e le funzioni che agiscono su quei dati sotto un unico nome. Ricorrere a una classe è opportuno quando diversi pezzi di stato appartengono insieme e la maggior parte delle funzioni di uno script prende quello stesso insieme di valori come argomenti.
2.20.1. La parola chiave class¶
La parola chiave è class. Il corpo contiene un metodo __init__ che viene eseguito ogni volta che viene creata una nuova istanza:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Output:
3 4
Point è la classe; p è un”istanza di essa. Le parentesi nella chiamata Point(3, 4) invocano __init__, che assegna gli argomenti agli attributi della nuova istanza. self è il nome convenzionale per l’istanza; self.x imposta un attributo che gli altri metodi dell’istanza leggeranno.
2.20.2. Quando usare una classe¶
Ricorri a una classe quando queste condizioni sono vere allo stesso tempo:
Un manipolo di valori correlati viaggiano insieme dappertutto (la
xe laydi un punto; il valore, l’unità e il timestamp di una lettura del sensore).Diverse funzioni prendono quello stesso insieme di valori e operano su di essi.
È utile mantenere in vita più di uno di questi gruppi alla volta, distinti l’uno dall’altro.
Se i dati sono occasionali, un semplice dict o tuple è di solito sufficiente. Se ti serve solo un singolo gruppo di costanti, le variabili a livello di modulo vanno bene. Le classi non sono il contenitore predefinito – si guadagnano il loro posto quando stato e comportamento vogliono stare insieme.
2.20.3. Cosa fa __init__¶
__init__ è semplicemente un metodo normale. Qualsiasi cosa assegnata a self al suo interno diventa un attributo della nuova istanza:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Output:
temperature C []
readings è inizializzata a una lista vuota – ogni nuova istanza ottiene la propria lista, non una condivisa. Qualsiasi cosa non assegnata a self è locale a __init__ e scompare quando questo termina.