Цикл по всем переменным-членам класса в python

Как вы получаете список всех переменных в итеративном классе? Вид вроде locals(), но для класса

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

    def as_list(self)
       ret = []
       for field in XXX:
           if getattr(self, field):
               ret.append(field)
       return ",".join(ret)

это должно возвращать

>>> e = Example()
>>> e.as_list()
bool143, bool2, foo

Ответ 1

dir(obj)

дает вам все атрибуты объекта. Вам нужно отфильтровать участников из методов и т.д. Самостоятельно:

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

example = Example()
members = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")]
print members   

Вы получите:

['blah', 'bool143', 'bool2', 'foo', 'foobar2000']

Ответ 2

Если вы хотите, чтобы только переменные (без функций) использовали:

vars(your_object)

Ответ 3

@truppo: ваш ответ почти прав, но вызываемый всегда будет возвращать false, поскольку вы просто передаете строку. Вам нужно что-то вроде следующего:

[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]

который будет отфильтровывать функции

Ответ 4

>>> a = Example()
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', 'bool143', 'bool2', 'blah',
'foo', 'foobar2000', 'as_list']

&mdash, как вы видите, это дает вам все атрибуты, поэтому вам придется немного отфильтровать. Но в основном, dir() - это то, что вы ищете.

Ответ 5

row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns} if r else {}

Используйте это.

Ответ 6

Легкий способ сделать это - сохранить все экземпляры класса в list.

a = Example()
b = Example()
all_examples = [ a, b ]

Объекты не spring возникают спонтанно. Некоторая часть вашей программы создала их по какой-то причине. Создание сделано по какой-то причине. Сбор их в списке также может быть сделан по какой-то причине.

Если вы используете factory, вы можете сделать это.

class ExampleFactory( object ):
    def __init__( self ):
        self.all_examples= []
    def __call__( self, *args, **kw ):
        e = Example( *args, **kw )
        self.all_examples.append( e )
        return e
    def all( self ):
        return all_examples

makeExample= ExampleFactory()
a = makeExample()
b = makeExample()
for i in makeExample.all():
    print i

Ответ 7

    class Employee:
    '''
    This class creates class employee with three attributes 
    and one function or method
    '''

    def __init__(self, first, last, salary):
        self.first = first
        self.last = last
        self.salary = salary

    def fullname(self):
        fullname=self.first + ' ' + self.last
        return fullname

emp1 = Employee('Abhijeet', 'Pandey', 20000)
emp2 = Employee('John', 'Smith', 50000)

print('To get attributes of an instance', set(dir(emp1))-set(dir(Employee))) # you can now loop over