inspect.getmembers () против __dict __. items () против dir () - PullRequest
25 голосов
/ 20 июля 2011

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

>>> 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

1 Ответ

21 голосов
/ 20 июля 2011

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

...