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,如果有的话
如果在类定义之后执行的唯一问题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)
| 归档时间: |
|
| 查看次数: |
3325 次 |
| 最近记录: |