Opcje frozen i comparison
Twórz niezmienne i uporządkowane dataclasses
Opcje frozen i comparison to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 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.
Opcje dekoratora
Dekorator @dataclass przyjmuje argumenty nazwane, które sterują generowaniem metod. Najbardziej przydatne są frozen i order.
frozen=Truesprawia, że instancje są niemutowalne.order=Truedodaje operatory porównania.
Niemutowalne dataclasses
Przy ustawieniu frozen=True wygenerowana klasa blokuje przypisywanie atrybutów po utworzeniu instancji. Każda próba takiego przypisania zgłasza FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)Dlaczego niemutowalność pomaga
Niemutowalne obiekty ułatwiają rozumowanie o kodzie: ich wartość nie zmienia się po utworzeniu, więc można je bezpiecznie współdzielić między funkcjami i wątkami. Są również bezpieczne jako klucze słowników i elementy zbiorów.
Zamrożenie oznacza możliwość haszowania
Zamrożona klasa dataclass jest domyślnie hashowalna, więc można używać jej instancji w zbiorach lub jako kluczy słowników. Modyfikowalne dataclasses nie są hashowalne, chyba że jawnie włączą Państwo tę możliwość.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))Zastępowanie zamrożonych wartości
Ponieważ zamrożonej instancji nie można modyfikować, należy użyć dataclasses.replace(), aby utworzyć zmodyfikowaną kopię. Oryginał pozostaje nietknięty.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)Dataclasses z obsługą porównywania
Domyślnie dataclass obsługuje tylko ==. Należy dodać order=True, aby wygenerować również operatory <, <=, > i >=.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))Jak działa porównywanie
Porównywanie traktuje pola jak krotkę i porównuje je od lewej do prawej, w kolejności ich zadeklarowania. Pierwsze pole ma największe znaczenie.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))Sortowanie instancji dataclass
Ponieważ uporządkowane dataclasses definiują operatory porównywania, można bezpośrednio sortować ich listę za pomocą sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)Kontrolowanie klucza sortowania
Aby sortować według czegoś innego niż naturalny porządek pól, należy umieścić na początku ukryte pole sortowania za pomocą field(init=False) i ustawić je w __post_init__. Pozostałe pola można wykluczyć z porównywania za pomocą compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))Połączenie frozen i order
Opcje można łączyć. Zamrożona dataclass z obsługą porównywania tworzy doskonały niemutowalny typ wartości, idealny do kluczy, numerów wersji lub współrzędnych.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])eq i wartość domyślna
Opcja eq określa, czy zostanie wygenerowana metoda __eq__. Domyślnie ma wartość True. Należy pamiętać, że order=True wymaga eq=True, ponieważ porządkowanie opiera się na równości.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))Szybkie sprawdzenie
Co się stanie po przypisaniu wartości do pola instancji zamrożonej dataclass?
Podsumowanie
Nauczyli się Państwo tworzyć niemutowalne dataclasses z obsługą porównywania.
frozen=Trueblokuje modyfikowanie i sprawia, że instancje są hashowalne.- Do tworzenia zmodyfikowanych kopii służy
replace(). order=Truegeneruje operatory porównywania, które porównują pola jak krotkę.- Połączenie obu opcji pozwala tworzyć solidne typy wartości.
Często zadawane pytania
Czy lekcja „Opcje frozen i comparison” jest bezpłatna?
Tak — pełny tekst „Opcje frozen i comparison” 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 „Opcje frozen i comparison”?
Twórz niezmienne i uporządkowane dataclasses Ć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 3 z 4.
Ile czasu zajmuje lekcja „Opcje frozen i comparison”?
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