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 x e la y di 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.