在Python中分配类布尔值

Kel*_*tek 16 python class conditional-statements

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

   if not x:
       print "X is false."
Run Code Online (Sandbox Code Playgroud)

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

int*_*jay 25

您需要__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'
Run Code Online (Sandbox Code Playgroud)

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

在Python 3中,__bool__使用而不是__nonzero__.

  • 请注意,它是Python 3中的`__bool__`. (8认同)
  • @Kelketek:我稍微充实了这个例子。不需要将()放在任何地方,就像列表和数字一样。 (2认同)

Mar*_*cin 8

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

In [254]: if Foo():
   .....:     print 'Yeah'
   .....: else: print 'Nay'
   .....:
Nay
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要超便携,你只能定义__len__,这将在两种语言中产生相同的效果,但它具有(潜在的)缺点,它暗示你的对象有一个有意义的长度度量(它可能不).

这适用于任何实例,具体取决于您在方法中放入的实际逻辑.

  • “这意味着你的对象有一个有意义的长度测量”,这里是关于语义的真正智慧的话。 (2认同)