在Python中分配类布尔值

时间:2012-03-20 13:38:01

标签: python class conditional-statements

如果Python中的语句允许您执行以下操作:

   if not x:
       print "X is false."

如果你使用的是空列表,空字典,None,0等,这是有效的,但如果你有自己的自定义类怎么办?你能为该类指定一个假值,以便在相同的条件样式中,它将返回false吗?

2 个答案:

答案 0 :(得分:22)

您需要在班级上实施__nonzero__方法。这应该返回True或False来确定真值:

class MyClass(object):
    def __init__(self, val):
        self.val = val
    def __nonzero__(self):
        return self.val != 0  #This is an example, you can use any condition

x = MyClass(0)
if not x:
    print 'x is false'

如果尚未定义__nonzero__,则实现将调用__len__,如果实例返回非零值,则该实例将被视为True。如果尚未定义__len__,则所有实例都将被视为True。

在Python 3中,使用__bool__代替__nonzero__

答案 1 :(得分:7)

class Foo:
     def __nonzero__(self): return False
     __bool__ = __nonzero__ # this is for python3

In [254]: if Foo():
   .....:     print 'Yeah'
   .....: else: print 'Nay'
   .....:
Nay

或者,如果你想要超便携,你可以只定义__len__,这对两种语言都有相同的效果,但是它有(潜在的)缺点,它暗示你的对象有一个有意义的长度测量(可能没有)。

这适用于任何实例,具体取决于您在方法中添加的实际逻辑。