迭代一类“属性”

时间:2012-07-25 11:14:06

标签: python class

存在以下类。

class Reaction(object):
    Var1 = "lorem"
    Var2 = "impsum"
    Var3 = "dolor"

我想迭代这个类的属性,就像下面的代码一样。

for value in Reaction:
    print value

这应该产生以下输出。

lorem
ipsum
dolor

我已经找到了这个主题:How to iterate over a the attributes of a class, in the order they were defined?,但它并没有真正帮助我。

如何让我的课程可迭代?

编辑:我在这篇文章中想到了类似的内容:Build a Basic Python Iterator

3 个答案:

答案 0 :(得分:3)

如果您确实需要一个可通过点表示法访问其成员的对象,但您仍希望迭代它们,则需要namedtuple

Reaction = collections.namedtuple('Reaction', ['Var1', 'Var2', 'Var3'])
reaction = Reaction('lorem', 'ipsum', 'dolor')
for value in reaction:
    print value

答案 1 :(得分:1)

首先,你正在尝试的是有点不寻常 - 通常,dict用于此类事情

Reaction = {
   var1: "Lorem",
   var2: "Ipsum",
   var3: "Dolor"
}

如果由于某种原因您仍然偏好您的方法,则可以使用inspect.getmembers()。辅助函数可能看起来像这样

def attributes(class_):
    for name, value in inspect.getmembers(class_):
        if not name.startswith("__"):
             yield name, value

然后你可以做

for name, value in attributes(Reactor):
    # do stuff

答案 2 :(得分:1)

>>> for k, v in Reaction.__dict__.iteritems():
...     if not k.startswith('__'):
...         print v
... 
lorem
dolor
impsum

或更好:

>>> import inspect
>>> class Reaction(object):
...     Var1 = "lorem"
...     Var2 = "impsum"
...     Var3 = "dolor"
...     def __iter__(self):
...         return (v for k, v in inspect.getmembers(self) if not k.startswith('__'))
... 
>>> for value in Reaction():
...     print value
... 
lorem
impsum
dolor
相关问题