Давайте окунемся в исходный код!
Сначала рассмотрим определение namedtuple
:
result = type(typename, (tuple,), class_namespace)
class_namespace
содержит имена полей:
for index, name in enumerate(field_names):
doc = _sys.intern(f'Alias for field number {index}')
class_namespace[name] = _tuplegetter(index, doc)
namedtuple
по существу создает объект, производный от tuple
, где ваш первый пример создает объект из базы object
.
Заключение
Вы можете проверить этот ответ , чтобы увидеть разницу в памяти между ними.
Вам решать, какой из них использовать, основываясь на удобочитаемости и других вещах, которые вы хотели бы использовать с этим объектом. Я бы сказал, что, основываясь на ответе выше, взглянув на ваш пример кода, я выбрал бы namedtuple
(или версию typing
, которая даже круче!:
class Employee(NamedTuple):
name: str
id: int
)