В чем разница между attr.asdict (x) и x .__ dict__? - PullRequest
0 голосов
/ 14 января 2020

В Python, когда вы хотите указать атрибуты вашего attrs расширенного класса, в чем разница между __dict__ и attr.asdict()? Какой из них вы должны использовать? Например, в этом примере они имеют одинаковый результат:

import attr

@attr.s(auto_attribs=True)
class MyClass:
  x: str

value = MyClass(x="hello")
print(value.__dict__)
# {'x': 'hello'}
print(attr.asdict(value))
# {'x': 'hello'}

1 Ответ

2 голосов
/ 14 января 2020

__dict__ - это атрибут реализации, который хранит только «прямые» атрибуты для каждого экземпляра (поэтому свойства или другие вычисленные атрибуты там не будут найдены). И он существует только для типов на основе dict - на основе слотов вообще нет dict.

attrs.asdict OTHO использует метаданные типа для получения списка имен атрибутов (поэтому он будет работать над основанные на слотах классы), использует getattr() для получения значений (поэтому он будет правильно извлекать вычисленные атрибуты), может рекурсивно использовать атрибуты, для которых "attrs-enabled", et c. Но он, конечно, будет работать только для типов с поддержкой attrs ...

...