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()iastuple(). - 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
- Definiowanie dataclass
- Wartości domyślne i field()
- Opcje frozen i comparison
- Biblioteka attrs