Получить атрибуты класса и объекта класса без методов и встроенных - PullRequest
2 голосов
/ 15 ноября 2011

Скажите, у меня есть этот класс:

class MyClass(object):
  my_attrib = 'foo'
  my_other_attrib = 'bar'

  def mymethod():
    pass

Теперь, как я могу получить ТОЛЬКО атрибуты класса MyClass, БЕЗ методов и встроенных функций, таких как __dict__ и т. Д.?

Я хочу получить словарь типа {'my_attrib':'foo', 'my_other_attrib':'bar'} применительно к классу выше.

Ответы [ 3 ]

7 голосов
/ 15 ноября 2011

Вы можете отфильтровать все, что вам не нужно, из __dict__:

def getAttributes(clazz):
    return {name: attr for name, attr in clazz.__dict__.items()
            if not name.startswith("__") 
            and not callable(attr)
            and not type(attr) is staticmethod}

Редактировать : альтернатива, которая ведет себя немного по-другому для свойств класса и дескрипторов:

def getAttributes2(clazz):
    attrs = {}
    for name in vars(clazz):
        if name.startswith("__"):
            continue
        attr = getattr(clazz, name)
        if callable(attr):
            continue
        attrs[name] = attr
    return attrs

(На практике это редко должно отличаться от первой версии.)

3 голосов
/ 15 ноября 2011

Это должно приблизить вас:

import inspect

class MyClass(object):
  my_attrib = 'foo'
  my_other_attrib = 'bar'

  def mymethod():
    pass

for name, value in inspect.getmembers(MyClass):
    if not inspect.ismethod(value) and not name.startswith('__'):
        print name

Это выводит:

my_attrib
my_other_attrib

ПРИМЕЧАНИЕ. - Может быть лучший / более официальный способ сделать это, ноэто должно указать вам правильное направление.

2 голосов
/ 15 ноября 2011

__dict__ дает вам все это, но вы можете использовать расширение C, возможно, чтобы получить то, что вы хотите.Не знаю, зачем вам это делать.

Вы можете использовать types ( doc ), чтобы различать членов __dict__.

...