Кто-нибудь может объяснить мне адекватными примерами, в чем разница между ч / б
>>> 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
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__
- это полное пространство имен, включающее атрибуты метакласса. 1127]