Sobes.tech
Middle

Какви са сходствата и разликите между dataclasses и namedtuple?

sobes.tech AI

Отговор от AI

dataclasses и namedtuple се използват за създаване на прости структури от данни, където основната цел е съхраняването на данни и достъпа до тях по име.

Сходства:

  • Позволяват създаването на класове с ясно дефинирани полета.
  • Осигуряват достъп до полетата по име (например, obj.field).
  • Автоматично генерират методите __repr__ (за удобна текстова репрезентация).
  • Поддържат unpacking.

Разлики:

Разлика collections.namedtuple dataclasses.dataclass
Мутируемост Неизменяем тип (immutable) По подразбиране изменяем, може да стане неизменяем (frozen=True)
Типизация Опционално, базирано на типови annotations Задължително, базирано на типови annotations
Наследяване Базиран на кортеж, трудно за разширяване Пълноценни класове, поддържат наследяване
Функционалност Само съхранение на данни, прост repr Повече възможности: __init__, __eq__, __hash__, __order__, полета с подразбиращи се стойности, post-processing (__post_init__)
Версия на Python Достъпно в Python 2 и 3 Достъпно от Python 3.7
Синтаксис Функция, връщаща клас Декоратор @dataclass

Примери:

# namedtuple
from collections import namedtuple

PointNT = namedtuple('PointNT', ['x', 'y'])
p1 = PointNT(1, 2)
# p1.x = 10 # Ще доведе до грешка, тъй като е неизменяем

print(p1)
# dataclass
from dataclasses import dataclass, field

@dataclass
class PointDC:
    x: int
    y: int = 0 # Стойност по подразбиране
    z: int = field(init=False) # Поле, което не се инициализира автоматично

    def __post_init__(self):
        self.z = self.x + self.y

p2 = PointDC(1)
print(p2)

p2.y = 5 # По подразбиране е променяем
print(p2)

# За създаване на неизменяем dataclass
@dataclass(frozen=True)
class ImmutablePoint:
    x: int
    y: int

p3 = ImmutablePoint(3, 4)
# p3.x = 10 # Ще доведе до грешка
print(p3)