Значения по умолчанию и field()
Задавайте значения по умолчанию и используйте параметры field()
«Значения по умолчанию и field()» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Значения полей по умолчанию
Как и параметры функций, поля датакласса могут иметь значения по умолчанию. Поле со значением по умолчанию можно не указывать при создании экземпляра.
from dataclasses import dataclass
@dataclass
class Server:
host: str
port: int = 8080
print(Server('localhost'))
print(Server('example.com', 443))Порядок имеет значение
Поля со значениями по умолчанию должны идти после полей без значений по умолчанию, точно как аргументы функций. В противном случае Python выдаст TypeError при определении класса.
from dataclasses import dataclass
@dataclass
class User:
name: str # required
active: bool = True # optional
print(User('Alice'))Проблема изменяемого значения по умолчанию
Нельзя использовать изменяемый объект, например список или словарь, непосредственно в качестве значения по умолчанию. Все экземпляры будут совместно использовать один и тот же объект. Python обнаруживает это и выдаёт ValueError, защищая Вас от ошибки.
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=...)
Чтобы задать изменяемое значение по умолчанию, используйте field(default_factory=...). Фабрика вызывается для каждого нового экземпляра, поэтому каждый экземпляр получает собственный новый объект.
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 и default_factory
Используйте field(default=...) для неизменяемых значений, если Вам также нужны другие параметры field(). Для изменяемых объектов используйте default_factory. Нельзя передавать оба параметра одновременно.
from dataclasses import dataclass, field
@dataclass
class Config:
retries: int = field(default=3)
tags: list = field(default_factory=list)
print(Config())Исключение поля из представления
Параметр repr=False скрывает поле в автоматически созданном __repr__. Это полезно для секретов или больших внутренних буферов.
from dataclasses import dataclass, field
@dataclass
class Account:
user: str
token: str = field(repr=False, default='secret')
print(Account('alice'))Исключение поля из сравнения
При использовании compare=False поле игнорируется автоматически созданным __eq__ (а также при упорядочивании). Два экземпляра могут быть равны, даже если значения этого поля различаются.
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))Поля без параметра __init__
Установка init=False исключает поле из __init__. Обычно это сочетают со значением по умолчанию или задают поле в __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__ для производных значений
Определите __post_init__, чтобы выполнить код сразу после созданного __init__. Это естественное место для вычисления полей, полученных из других полей.
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))Хранение метаданных
Аргумент metadata прикрепляет к полю произвольное отображение. Python его игнорирует, но инструменты и Ваш собственный код могут читать его для документации или подсказок по проверке.
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)Комбинирование параметров field()
Параметры можно комбинировать. Одно поле может одновременно скрываться из repr, не участвовать в сравнении и иметь значение по умолчанию.
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'))Быстрая проверка
Как задать полю датакласса пустой список в качестве значения по умолчанию?
Повторение
Вы научились задавать значения по умолчанию и использовать параметры field().
- Поля со значениями по умолчанию идут после обязательных полей.
- Используйте
default_factoryдля изменяемых значений по умолчанию. - Параметры
repr,compare,initиmetadataнастраивают каждое поле. __post_init__вычисляет производные значения.
Часто задаваемые вопросы
Урок «Значения по умолчанию и field()» бесплатный?
Да — полный текст урока «Значения по умолчанию и field()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Значения по умолчанию и field()»?
Задавайте значения по умолчанию и используйте параметры field() Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Значения по умолчанию и field()»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение датакласса
- Значения по умолчанию и field()
- Параметры неизменяемости и сравнения
- Библиотека attrs