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