Ответ 1
dir()
позволяет вам настроить, какие атрибуты публикуют ваши объекты, указав __dir__()
.
Из руководства, если __dir__()
не определено:
Если объект является объектом модуля, список содержит имена атрибутов модулей.
Если объект является объектом типа или класса, список содержит имена его атрибутов и рекурсивно атрибуты его оснований.
В противном случае список содержит имена атрибутов объектов, имена его атрибутов классов и рекурсивно атрибуты базовых классов его классов.
Это также возвращает inspect.getmembers()
, за исключением того, что он возвращает кортежи (name, attribute)
вместо имен.
object.__dict__
является словарем формы {key: attribute, key2: atrribute2}
и т.д.
object.__dict__.keys()
имеет то, чего не хватает другим.
Из документов в inspect.getmembers()
:
getmembers() не возвращает атрибуты метакласса, когда аргумент является классом (это поведение унаследовано от функции dir()).
Для int.__dict__.keys()
это
['__setattr__', '__reduce_ex__', '__reduce__', '__class__', '__delattr__', '__subclasshook__', '__sizeof__', '__init__']
Подводя итог, dir()
и inspect.getmembers()
в основном одинаковы, а __dict__
- это полное пространство имен, включая атрибуты метакласса.