0Pricing
Python Academy · Lekcja

Wartości domyślne i field()

Ustawiaj wartości domyślne i używaj opcji field()

Wartości domyślne i field() to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 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.

Nadawanie polom wartości domyślnych

Podobnie jak parametry funkcji, pola dataclass mogą mieć wartości domyślne. Pole z wartością domyślną można pominąć podczas tworzenia instancji.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

Kolejność ma znaczenie

Pola z wartościami domyślnymi muszą znajdować się po polach bez wartości domyślnych, dokładnie tak jak argumenty funkcji. W przeciwnym razie Python zgłasza TypeError podczas definiowania klasy.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

Pułapka zmiennej wartości domyślnej

Nie można użyć mutowalnego obiektu, takiego jak lista lub słownik, jako wartości bezpośredniej. Wszystkie instancje współdzieliłyby ten sam obiekt. Python wykrywa taką sytuację i zgłasza ValueError, aby zapewnić ochronę.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Aby nadać mutowalną wartość domyślną, należy użyć field(default_factory=...). Fabryka jest wywoływana dla każdej nowej instancji, dzięki czemu każda instancja otrzymuje własny, nowy obiekt.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default a default_factory

Należy użyć field(default=...) dla niemutowalnych wartości, gdy potrzebne są również inne opcje field(). Dla wszystkiego, co jest mutowalne, należy użyć default_factory. Nie można przekazać obu tych argumentów jednocześnie.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Wykluczanie pola z repr

Opcja repr=False ukrywa pole w generowanym __repr__. Jest to przydatne w przypadku sekretów lub dużych buforów wewnętrznych.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Wykluczanie pola z porównań

Przy ustawieniu compare=False pole jest pomijane przez generowane __eq__ (oraz podczas porządkowania). Dwie instancje mogą być równe, nawet jeśli wartości tego pola się różnią.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Pola init=False

Ustawienie init=False wyklucza pole z __init__. Zwykle łączy się je z wartością domyślną lub ustawia w __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ dla wartości pochodnych

Należy zdefiniować __post_init__, aby uruchamiać kod bezpośrednio po wygenerowanym __init__. Jest to naturalne miejsce do obliczania pól pochodnych od innych pól.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Przechowywanie metadanych

Argument metadata dołącza do pola dowolne mapowanie. Python je ignoruje, ale narzędzia i własny kod mogą je odczytywać na potrzeby dokumentacji lub wskazówek dotyczących walidacji.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Łączenie opcji field()

Opcje można łączyć. Pojedyncze pole może jednocześnie być ukryte w repr, pomijane podczas porównań i mieć wartość domyślną.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Szybkie sprawdzenie

Jak należy nadać polu dataclass domyślną wartość w postaci pustej listy?

Podsumowanie

Nauczyli się Państwo ustawiać wartości domyślne i używać opcji field().

  • Pola z wartościami domyślnymi umieszcza się za polami wymaganymi.
  • Dla mutowalnych wartości domyślnych należy używać default_factory.
  • Opcje repr, compare, init i metadata pozwalają dostosować każde pole.
  • __post_init__ oblicza wartości pochodne.

Często zadawane pytania

Czy lekcja „Wartości domyślne i field()” jest bezpłatna?

Tak — pełny tekst „Wartości domyślne i field()” 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 „Wartości domyślne i field()”?

Ustawiaj wartości domyślne i używaj opcji field() Ć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 2 z 4.

Ile czasu zajmuje lekcja „Wartości domyślne i field()”?

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