0

存在以下课程。

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

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

for value in Reaction:
    print value

这应该产生以下输出。

lorem
ipsum
dolor

我已经找到了这个主题:如何按照定义的顺序遍历类的属性?,但它并没有真正帮助我。

如何使我的类可迭代?

编辑:我在这篇文章中想到了类似的东西:构建一个基本的 Python 迭代器

4

3 回答 3

3

如果您确实需要一个可以通过点符号访问其成员但仍想遍历它们的对象,则需要一个namedtuple.

Reaction = collections.namedtuple('Reaction', ['Var1', 'Var2', 'Var3'])
reaction = Reaction('lorem', 'ipsum', 'dolor')
for value in reaction:
    print value
于 2012-07-25T11:27:42.250 回答
1

首先,您正在尝试的有点不寻常-通常, adict用于这种事情

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
于 2012-07-25T11:18:39.653 回答
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
于 2012-07-25T11:29:14.823 回答