动态创建静态变量(Enum hack)

ins*_*get 5 python enums class-variables python-3.x python-3.3

我正在尝试为一个Node类创建一组状态。通常,我会通过将每个Node实例的state变量设置为int, 并记录哪个 int 对应于哪个状态来完成此操作(因为我没有enums)。
这次,我想尝试一些不同的东西,所以我决定这样做:

class Node:
  state1 = 1
  state2 = 2

  def __init__(self):
    ...
Run Code Online (Sandbox Code Playgroud)

这效果很好。然而,我遇到了一个问题,我有很多状态 - 太多而无法手动输入。此外,对于这么多状态,我可能会犯错误并将其分配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)
Run Code Online (Sandbox Code Playgroud)

虽然这可以修复为状态赋值时的人为错误,但它非常丑陋,因为类变量是在类定义之外设置的。

有没有一种方法可以以这种方式在类定义中设置类变量?我理想地想这样做:

class Node:
  for i,state in enumerate("state1 state2".split()):
    setattr(Node, state, i)
Run Code Online (Sandbox Code Playgroud)

...但这不会起作用,因为Node尚未定义,并且会导致NameError

或者,enumpython3.3中是否存在s?

我正在使用Python3.3.2,如果有的话

aba*_*ert 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
Run Code Online (Sandbox Code Playgroud)