Pythoner
Фотография
✈️ В Python dataclasses — это модуль, предоставляющий декоратор @dataclass, который автоматически генерирует шаблонный код для классов, преимущественно предназначенных для хранения данных. Это упрощает создание классов с атрибутами, методами __init__, __repr__, __eq__ и другими, без необходимости писать их вручную.
➡️ Применение dataclasses позволяет сократить объем кода, улучшить его читаемость и уменьшить вероятность ошибок, связанных с ручным написанием шаблонного кода. Они особенно полезны для создания классов, представляющих структуры данных или объекты с простым набором атрибутов.
➡️ Вот пример использования dataclasses:
from dataclasses import dataclass, field
@dataclass(order=True) # order=True добавляет методы сравнения
class Person:
name: str
age: int
city: str = "Unknown" # Значение по умолчанию
email: str = field(default="[email protected]", repr=False) # repr=False скрывает поле в __repr__
scores: list[int] = field(default_factory=list) # mutable default value
person1 = Person("Alice", 30, "New York", scores=[100, 90])
person2 = Person("Bob", 25, "Los Angeles")
person3 = Person("Charlie", 35, scores=[80, 85])
person4 = Person("Alice", 30, "New York", scores=[100, 90])
print(person1) # Вывод: Person(name='Alice', age=30, city='New York', scores=[100, 90])
print(person2) # Вывод: Person(name='Bob', age=25, city='Los Angeles', scores=[])
print(person3) # Вывод: Person(name='Charlie', age=35, city='Unknown', scores=[80, 85])
print(person1 == person4) # True
print(person1 > person2) # True (сравнение по name, затем age)
# Изменение атрибутов:
person1.city = "San Francisco"
person1.scores.append(95)
print(person1) # Вывод: Person(name='Alice', age=30, city='San Francisco', scores=[100, 90, 95])
# Post-init processing
@dataclass
class InventoryItem:
"""Class for keeping track of an item in inventory."""
name: str
unit_price: float
quantity_on_hand: int = 0
def __post_init__(self):
self.total_cost = self.unit_price * self.quantity_on_hand
item = InventoryItem("Pen", 1.5, 50)
print(item.total_cost) # 75.0
⬆️ В этом примере показано создание dataclass Person с различными типами полей, включая значение по умолчанию, field для скрытия поля в __repr__ и default_factory для изменяемых значений по умолчанию. Демонстрируется вывод информации о dataclass с помощью print, сравнение объектов dataclass и изменение атрибутов. Также приведен пример использования __post_init__ для выполнения действий после инициализации dataclass, как, например, вычисление total_cost в InventoryItem. order=True позволяет сравнивать экземпляры dataclass.
🐍Pythoner
24 · 1.7K ·