0

次のクラスが存在します。

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

次のコードのように、このクラスの属性を繰り返し処理したいと思います。

for value in Reaction:
    print value

これにより、次の出力が生成されます。

lorem
ipsum
dolor

私はすでにこのトピックを見つけました:クラスの属性を、定義された順序で反復する方法は? 、しかし、それは本当に私を助けません。

クラスを反復可能にするにはどうすればよいですか?

編集:私はこの投稿のようなものを考えました: Build a Basic Python Iterator

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
>>> 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 に答える
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 に答える