Подтвердить что ты не робот

Inspect.getmembers() vs __dict __. items() vs dir()

Может ли кто-нибудь объяснить мне адекватные примеры, какая разница b/w

>>> import inspect
>>> inspect.getmembers(1)

и

>>> type(1).__dict__.items()

и

>>> dir(1)  

за исключением того, что они показывают уменьшение атрибутов и методов в этом порядке. 1 целое число (но оно может быть любого типа.)


ИЗМЕНИТЬ

>>>obj.__class__.__name__  #gives the class name of object  
>>>dir(obj)                #gives attributes & methods  
>>>dir()                   #gives current scope/namespace
>>>obj.__dict__            #gives attributes
4b9b3361

Ответ 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__ - это полное пространство имен, включая атрибуты метакласса.