Rozdział 17 · Architektura

GameState z dataclass

Od prototypowych zmiennych globalnych do pojedynczego typowanego obiektu stanu.

GameState — @dataclass (rozdział 14)

game_state.py
from dataclasses import dataclass, field

@dataclass
class GameState:
    board: list[str] = field(default_factory=lambda: [""] * 9)
    current_player: str = "X"
    game_over: bool = False
    winner: str | None = None
    winning_line: tuple[int, int, int] | None = None
    score_x: int = 0
    score_o: int = 0
    draws: int = 0
NIE board: list[str] = [„”
Dla @dataclass to nawet nie jest cichy błąd: Python zauważa zmienną domyślną wartość (list, dict, set) właśnie przy ustalaniu klasy i natychmiast odmawia — ValueError: mutable default <class 'list'> for field board is not allowed: use default_factory. Klasa z takim łańcuch znaków w ogóle się nie utworzy, więc do „dzielenia między instancjami” (rozdział 14 omawiał tę pułapkę dla zwykłych domyślnych argumentów zmiennych) nie dojdzie. field(default_factory=lambda: [""] * 9) jest jedynym sposobem dataclass by za każdym razem, gdy tworzymy instancję, pole otrzymało nowy lista.
GameStateboard: list[str]current_player: strgame_over: boolwinner: str | Nonewinning_line: tuple |Nonescore_x: intscore_o: intdraws: int
GameState przechowuje TYLKO dane partii — żadnego widżetu w środku.
Praktyka: GameState jak dataclass
Automatyczna kontrola — wartości domyślne, niezależność instancji, pola stanu
Otwórz praktykę →