4

Nodeクラスの一連の状態を作成しようとしています。通常、これを行うには、各Nodeインスタンスのstate変数を に設定しint、どの int がどの状態に対応するかを文書化します (s がないためenum)。
今回は、ちょっと変わったものを試してみたいので、これにしました。

class Node:
  state1 = 1
  state2 = 2

  def __init__(self):
    ...

これはうまくいきます。しかし、状態がたくさんあるという問題に遭遇しました。手動で入力するには多すぎます。さらに、これほど多くの状態があると、誤りを犯して同じものを 2 つの状態に割り当てる可能性がありますint。これは、状態をテストするときにバグの原因になります (例:とが両方でif self.state==Node.state1ある場合に失敗する可能性があります)。Node.state1Node.state23

このため、次のようなことをしたいと思います。

class Node:
  def __init__(self):
    ...
...

for i,state in enumerate("state1 state2".split()):
  setattr(Node, state, i)

これにより、状態に値を割り当てる際の人的エラーは修正されますが、クラス変数がクラス定義の外で設定されているため、非常に見苦しいものです。

この方法でクラス定義内にクラス変数を設定する方法はありますか? 私は理想的にはこれをしたいと思います:

class Node:
  for i,state in enumerate("state1 state2".split()):
    setattr(Node, state, i)

...しかし、Nodeまだ定義されていないため、それは機能しません。NameError

あるいは、enums は python3.3 に存在しますか?

問題があれば、私はPython3.3.2を使用しています

4

5 に答える 5

2

クラス定義の後に行うことの唯一の問題setattrが、それが見苦しく、間違った場所にあることである場合は、デコレータを使用してそれを行うのはどうですか?

def add_constants(names):
    def adder(cls):
        for i, name in enumerate(names):
            setattr(cls, name, i)
        return cls
    return adder

@add_constants("state1 state2".split())
class Node:
    pass
于 2013-11-12T05:08:04.440 に答える