0Pricing
Python Academy · Lezione

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() e astuple() 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

  1. Definire una dataclass
  2. Valori predefiniti e field()
  3. Opzioni frozen e di confronto
  4. La libreria attrs
← Torna a Python Academy