python получает только атрибут класса без суперклассов

Так возможно ли получить словарь / список атрибутов ТОЛЬКО для самого конкретного класса? До сих пор я использую

for attr, value in obj.__class__.__dict__.iteritems(): 

Но это также даст мне определения, определенные в суперклассах. Есть ли способ избежать этого?

3 Solutions collect form web for “python получает только атрибут класса без суперклассов”

Выдержка из документации на python

Класс имеет пространство имен, реализуемое объектом словаря. Ссылки на атрибуты класса переводится в поисковые запросы в этом словаре, например, Cx переводится на C .__ dict __ ["x"] (хотя для классов нового стиля, в частности, имеется несколько крючков, которые позволяют использовать другие способы определения атрибутов). Когда имя атрибута не найдено там, поиск атрибутов продолжается в базовых классах

Другими словами, __dict__ содержит только «локальные» атрибуты класса, атрибуты суперкласса хранятся в суперклассе __dict__.

Таким образом, вы можете использовать __class__.__dict__.iteritems() для извлечения только атрибутов класса.

Он не показывает мне атрибуты суперкласса:

 >>> 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__'] 

Если вы хотите получить атрибут всех атрибутов класса и их значений, включая унаследованные классы, то вы можете использовать следующий код:

 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) 
Python - лучший язык программирования в мире.