Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
__str__.__str__ a przeznaczonym dla programistów __repr__.@dataclass z polami z typami.Python nazywa metody o nazwach takich jak __str__ i __repr__ metodami dunder (skrót od „double underscore”, czyli podwójne podkreślenie). str(obj) i print(obj) używają __str__, gdy jest zdefiniowane. repr(obj) ma pomagać programistom w inspekcji obiektu; domyślnie Python może pokazać ogólną reprezentację z klasą i adresem.
Dla klas zorientowanych na dane @dataclass z dataclasses automatycznie tworzy typowe metody na podstawie zadeklarowanych pól z adnotacjami typów. Obejmuje to inicjalizator, użyteczną reprezentację i równość opartą na wartościach (==). Adnotacje typów opisują pola; nie walidują automatycznie typów w czasie działania.
W dataclass nadal możesz zdefiniować własne __str__, aby kontrolować wyświetlanie, zachowując wygenerowany inicjalizator i równość. Preferuj dataclasses dla prostych rekordów strukturalnych; złożone zachowanie zostaw w zwykłych klasach, gdy zwiększa to czytelność.
__str__class Server:
def __init__(self, name, region):
self.name = name
self.region = region
def __str__(self):
return f"{self.name}@{self.region}"
print(Server("worker", "eu"))Wynik:
worker@eu__str__ musi zwrócić napis, a nie go wypisać.
Ta klasa definiuje obie reprezentacje dla różnych odbiorców.
class Build:
def __init__(self, number):
self.number = number
def __str__(self):
return f"Build #{self.number}"
def __repr__(self):
return f"Build(number={self.number})"
build = Build(9)
print(str(build))
print(repr(build))Wynik:
Build #9
Build(number=9)@dataclass na utworzenie inicjalizatorafrom dataclasses import dataclass
@dataclass
class Job:
name: str
retries: int
job = Job("backup", 2)
print(job.name)
print(repr(job))Wynik:
backup
Job(name='backup', retries=2)Pola automatycznie stają się parametrami konstruktora.
Dwie różne instancje mogą nadal reprezentować równe dane.
from dataclasses import dataclass
@dataclass
class Version:
component: str
major: int
first = Version("api", 2)
second = Version("api", 2)
print(first == second)
print(first is second)Wynik:
True
False| Potrzeba | Python |
|---|---|
| Napis przyjazny człowiekowi | __str__(self) zwraca tekst |
| Reprezentacja dla programistów | __repr__(self) zwraca tekst |
| Konstruktor rekordu danych | @dataclass z polami z adnotacjami |
| Te same wartości pól | first == second |
| Dokładnie ten sam obiekt | first is second |
None z __str__; Python wymaga napisu.is do porównywania niezależnych rekordów danych według wartości.@dataclass uniemożliwia pisanie własnych metod; nadal możesz dostosować zachowanie.