0Pricing
Python Academy · Lekcja

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=True sprawia, że instancje są niemutowalne.
  • order=True dodaje 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=True blokuje modyfikowanie i sprawia, że instancje są hashowalne.
  • Do tworzenia zmodyfikowanych kopii służy replace().
  • order=True generuje 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

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