我有枚举,我喜欢一些像0这样的常量。默认情况并非如此(这本身就很奇怪)。我试图直接将非零方法绑定到枚举成员,但如果是statment则不会调用它。到底是怎么回事!?有没有明确的方法让FOO表现得像0?
from enum import Enum
class A(Enum):
FOO = 0
BAR = 1
if A.FOO: print 'foo!'
if A.BAR: print 'bar!'
setattr(A.FOO, '__nonzero__', (lambda self:False).__get__(A.FOO, A.FOO.__class__))
if A.FOO: print 'foo!'
print A.FOO.__nonzero__()
输出
foo!
bar!
foo!
False
更新:对于Python 2.7,zvone的解决方案看起来像这样并且工作正常:
from enum import Enum
class A(Enum):
FOO = 0
BAR = 1
def __nonzero__(self): return self!=A.FOO
if A.FOO: print 'foo!'
if A.BAR: print 'bar!'
答案 0 :(得分:2)
这里有几个问题:
enum
(问题标记为2.7) - 请参阅enum doc;也许您正在使用enum34
backport?enum
,但那里没有__nonzero__
(Python 3使用__bool__
代替)__nonzero__
/ __bool__
方法(如果存在)必须在类上定义,而不是在实例上定义所以,最后,Python 3中有一个解决方案:
class A(Enum):
FOO = 0
BAR = 1
def __bool__(self):
# only return False for A.FOO
return self != A.FOO
Python 2的解决方案:
class A(Enum):
FOO = 0
BAR = 1
def __nonzero__(self):
# return boolean value of any A
return bool(self._value_)