0Pricing
Python Academy · Lekcja

Definiowanie dataclass

Użyj @dataclass, aby usunąć powtarzalny kod

Definiowanie dataclass to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Dlaczego dataclasses?

Gdy tworzona klasa służy głównie do przechowywania danych, pojawia się konieczność powtarzania tego samego kodu pomocniczego: __init__, __repr__ i __eq__. Moduł dataclasses generuje to wszystko na podstawie prostych deklaracji pól.

  • Mniej kodu do napisania i przeczytania.
  • Mniejsze ryzyko literówek w __init__.
  • Moduł jest częścią biblioteki standardowej od wersji Python 3.7.

Stare podejście

Oto zwykła klasa przechowująca punkt. Proszę zwrócić uwagę, ile kodu trzeba napisać tylko po to, aby przechować dwie liczby.

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
print(p.x, p.y)

Dekorator @dataclass

Należy umieścić @dataclass nad klasą i zadeklarować pola za pomocą adnotacji typów. Python automatycznie wygeneruje __init__.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p.x, p.y)

Automatyczny __repr__

Dataclasses tworzą również czytelny __repr__, dzięki czemu wyświetlenie obiektu pokazuje jego pola zamiast adresu w pamięci.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

Automatyczny __eq__

Dwie instancje dataclass są uznawane za równe, gdy wszystkie ich pola są równe. Nie trzeba ręcznie pisać __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))

Adnotacje typów są wymagane

Każde pole musi mieć adnotację typu. To właśnie adnotacja informuje mechanizm dataclass, że dana nazwa jest polem. Przypisanie wartości bez adnotacji staje się zwykłym atrybutem klasy, a nie polem.

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

u = User('Alice', 30)
print(u)

Dodawanie metod

Dataclass nadal jest zwykłą klasą. Można dodawać zwykłe metody korzystające z wygenerowanych pól.

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

Modyfikowanie pól

Domyślnie instancje dataclass są modyfikowalne, więc po utworzeniu można ponownie przypisywać wartości polom, tak jak zwykłym atrybutom.

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

c = Counter(0)
c.value += 5
print(c.value)

asdict i astuple

Funkcje pomocnicze asdict() i astuple() konwertują instancję na słownik lub krotkę, co jest przydatne podczas serializacji.

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(asdict(p))
print(astuple(p))

Zagnieżdżone dataclasses

Pole dataclass może samo być inną dataclass. Wygenerowane __repr__ i asdict() rekurencyjnie przetwarzają zagnieżdżone struktury.

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))

Kiedy używać dataclasses

Po dataclass warto sięgać, gdy klasa służy głównie do grupowania powiązanych wartości.

  • Obiekty konfiguracji.
  • Rekordy zwracane przez funkcję.
  • Proste typy wartości, takie jak współrzędne lub kwoty pieniężne.

W przypadku klas, w których dominuje zachowanie, a nie dane, zwykła klasa może być czytelniejsza.

Szybkie sprawdzenie

Co dekorator @dataclass generuje automatycznie?

Podsumowanie

Nauczyli się Państwo używać @dataclass do usuwania powtarzalnego kodu pomocniczego.

  • Pola należy deklarować za pomocą adnotacji typów.
  • __init__, __repr__ i __eq__ są generowane automatycznie.
  • Do konwertowania instancji należy używać asdict() i astuple().
  • Nadal można dodawać metody i zagnieżdżać dataclasses.

Często zadawane pytania

Czy lekcja „Definiowanie dataclass” jest bezpłatna?

Tak — pełny tekst „Definiowanie dataclass” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Definiowanie dataclass”?

Użyj @dataclass, aby usunąć powtarzalny kod Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Definiowanie dataclass”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Definiowanie dataclass
  2. Wartości domyślne i field()
  3. Opcje frozen i comparison
  4. Biblioteka attrs
← Powrót do Python Academy