在 Python 中分配类布尔值

Posted

技术标签:

【中文标题】在 Python 中分配类布尔值【英文标题】:Assign class boolean value in Python 【发布时间】:2012-04-04 23:37:27 【问题描述】:

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

   if not x:
       print "X is false."

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

【问题讨论】:

【参考方案1】:

你需要在你的类上实现__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__

【讨论】:

请注意,在 Python 3 中它是 __bool__ @delnan:谢谢,已添加到我的答案中。 这只有在我有 () 的情况下才有效吗?我希望有一种方法可以工作,无论该项目是空列表、0 还是我的对象的实例是错误的。这个类的成员,整数,字符串等,都将在一个列表中。我需要一种方法来普遍测试它们中的任何一个是否为假。 @Kelketek:我稍微充实了这个例子。无需将() 放在任何地方,它就像列表和数字一样。【参考方案2】:
class Foo:
     def __nonzero__(self): return False
     __bool__ = __nonzero__ # this is for python3

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

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

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

【讨论】:

“这意味着你的对象有一个有意义的长度度量”,这里是关于语义的真正智慧之词。

以上是关于在 Python 中分配类布尔值的主要内容,如果未能解决你的问题,请参考以下文章

python---布尔值和空值

Python第七天_布尔值的应用

python的〜在使用布尔值时发生了啥?

在python中获取随机布尔值?

Python中布尔类型的值都有哪些呢?

python-布尔值的加法运算