Извлечь из документации python
Класс имеет пространство имен, реализуемое объектом словаря. Ссылки на атрибуты класса переводится в поисковые запросы в этом словаре, например, C.x переводится в C .__ dict __ ["x"] (хотя для классов нового стиля, в частности, существует несколько крючков, которые позволяют использовать другие способы определения атрибутов). Когда имя атрибута не найдено там, поиск атрибутов продолжается в базовых классах
blockquote>. Другими словами, __dict__ содержит только «локальные» атрибуты класса, атрибуты суперкласса хранятся в суперкласс __dict __.
Итак, вы можете использовать
__class__.__dict__.iteritems()
для извлечения только атрибутов класса.
Если вы хотите получить dict всех атрибутов класса и их значений, включая унаследованные классы, тогда вы можете использовать следующий код:
cls_dict = { attr: getattr(obj.__class__, attr)
for attr in dir(obj.__class__) }
for attr, val in cls_dict.iteritems():
logging.info("%s = %s", attr, val)
Он не показывает мне атрибуты суперкласса:
>>> class A(object):
def a(self):
print a
b = 3
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b']
>>> list(a.__class__.__dict__)
['a', '__module__', 'b', '__dict__', '__weakref__', '__doc__']
__module__
, __dict__
, __weakref__
, __doc__
кажутся атрибутами, созданными для каждого класса по умолчанию.
Этот список атрибутов по умолчанию отличается для классов старого стиля:
>>> class B:
pass
>>> list(B().__class__.__dict__)
['__module__', '__doc__']