Объяснение к уроку
После этого урока ты сможешь:
__str__.__str__ и ориентированным на разработчика методом __repr__.@dataclass и типизированных полей.В Python методы с именами вроде __str__ и __repr__ называют специальными методами (dunder methods, от double underscore). Функции str(obj) и print(obj) используют __str__, если он определен. Метод repr(obj) помогает разработчикам инспектировать объект; по умолчанию Python может показывать общее представление с именем класса и адресом в памяти.
Для классов, ориентированных на хранение данных, декоратор @dataclass из модуля dataclasses автоматически создает стандартные методы на основе объявленных полей с аннотациями типов. Это включает инициализатор, полезное строковое представление и сравнение по значениям (==). Аннотации типов описывают поля; они не выполняют автоматическую валидацию типов во время выполнения.
Ты по-прежнему можешь определить собственный __str__ в dataclass для управления отображением, сохраняя сгенерированные инициализатор и равенство. Отдавай предпочтение dataclasses для простых структурированных записей; сохраняй сложную логику внутри обычных классов, когда это добавляет ясности.
__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"))Вывод:
worker@eu__str__ должен возвращать строку, а не выводить ее на экран.
Этот класс определяет оба представления для разной аудитории.
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))Вывод:
Build #9
Build(number=9)@dataclassfrom dataclasses import dataclass
@dataclass
class Job:
name: str
retries: int
job = Job("backup", 2)
print(job.name)
print(repr(job))Вывод:
backup
Job(name='backup', retries=2)Поля автоматически становятся параметрами конструктора.
Два разных экземпляра могут представлять равные данные.
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)Вывод:
True
False| Потребность | Python |
|---|---|
| Понятная человеку строка | __str__(self) возвращает текст |
| Представление для разработчика | __repr__(self) возвращает текст |
| Конструктор записи данных | @dataclass с аннотированными полями |
| Одинаковые значения полей | first == second |
| Один и тот же объект | first is second |
None из __str__; Python требует строку.is для сравнения независимых записей данных по значению.@dataclass запрещает писать собственные методы; ты по-прежнему можешь добавлять нужное поведение.