Definire una dataclass
Utilizzi @dataclass per eliminare il codice ripetitivo.
Definire una dataclass è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.
Perché usare le dataclass?
Quando scrive una classe che contiene principalmente dati, finisce per ripetere lo stesso codice ripetitivo: un __init__, un __repr__ e un __eq__. Il modulo dataclasses genera tutto questo per Lei a partire da semplici dichiarazioni dei campi.
- Meno codice da scrivere e leggere.
- Meno possibilità di commettere errori di battitura in
__init__. - Incluso nella libreria standard a partire da Python 3.7.
Il metodo tradizionale
Ecco una classe semplice che memorizza un punto. Noti quanto codice è necessario solo per memorizzare due numeri.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(1, 2)
print(p.x, p.y)Il decoratore @dataclass
Applichi @dataclass sopra una classe e dichiari i campi con annotazioni di tipo. Python genera automaticamente __init__.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(p.x, p.y)__repr__ automatico
Le dataclass creano anche un __repr__ leggibile, così quando stampa l'oggetto ne vengono mostrati i campi invece dell'indirizzo di memoria.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
print(Point(3, 4))__eq__ automatico
Due istanze di una dataclass risultano uguali quando tutti i loro campi sono uguali. Non è necessario scrivere manualmente __eq__.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
print(Point(1, 2) == Point(1, 2))
print(Point(1, 2) == Point(9, 9))Le annotazioni di tipo sono obbligatorie
Ogni campo deve avere un'annotazione di tipo. È l'annotazione a comunicare al meccanismo delle dataclass che il nome corrisponde a un campo. Un'assegnazione senza annotazione diventa un normale attributo della classe, non un campo.
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
u = User('Alice', 30)
print(u)Aggiunta di metodi
Una dataclass è comunque una classe normale. Può aggiungere normali metodi che utilizzano i campi generati.
from dataclasses import dataclass
@dataclass
class Rectangle:
width: int
height: int
def area(self):
return self.width * self.height
r = Rectangle(3, 4)
print(r.area())Modifica dei campi
Per impostazione predefinita, le istanze delle dataclass sono mutabili, quindi può riassegnare i campi dopo la creazione, proprio come normali attributi.
from dataclasses import dataclass
@dataclass
class Counter:
value: int
c = Counter(0)
c.value += 5
print(c.value)asdict e astuple
Gli helper asdict() e astuple() convertono un'istanza in un dizionario o in una tupla, utile per la serializzazione.
from dataclasses import dataclass, asdict, astuple
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(asdict(p))
print(astuple(p))Dataclass annidate
Un campo di una dataclass può essere a sua volta un'altra dataclass. Il __repr__ generato e asdict() elaborano ricorsivamente le strutture annidate.
from dataclasses import dataclass, asdict
@dataclass
class Address:
city: str
@dataclass
class Person:
name: str
address: Address
p = Person('Bob', Address('Paris'))
print(asdict(p))Quando usare le dataclass
Scelga una dataclass quando una classe serve principalmente a raggruppare valori correlati.
- Oggetti di configurazione.
- Record restituiti da una funzione.
- Semplici tipi valore, come coordinate o importi monetari.
Per le classi incentrate più sul comportamento che sui dati, una classe normale potrebbe risultare più chiara.
Verifica rapida
Che cosa genera automaticamente il decoratore @dataclass?
Riepilogo
Ha imparato a usare @dataclass per eliminare il codice ripetitivo.
- Dichiari i campi con annotazioni di tipo.
__init__,__repr__e__eq__vengono generati automaticamente.- Utilizzi
asdict()eastuple()per convertire le istanze. - Può comunque aggiungere metodi e annidare dataclass.
Domande Frequenti
La lezione «Definire una dataclass» è gratuita?
Sì — il testo completo di «Definire una dataclass» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.
Cosa imparerò in «Definire una dataclass»?
Utilizzi @dataclass per eliminare il codice ripetitivo. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Python Academy?
Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Definire una dataclass»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Python Academy?
Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Definire una dataclass
- Valori predefiniti e field()
- Opzioni frozen e di confronto
- La libreria attrs