55

我想要的只是让 bool(myInstance) 返回 False(并且让 myInstance 在 if/or/and 等条件下评估为 False。我知道如何覆盖 >、<、=)

我试过这个:

class test:
    def __bool__(self):
        return False

myInst = test()
print bool(myInst) #prints "True"
print myInst.__bool__() #prints "False"

有什么建议么?

(我使用的是 Python 2.6)

4

6 回答 6

71

这是 Python 2.x 还是 Python 3.x?对于 Python 2.x,您正在寻找覆盖__nonzero__

class test:
    def __nonzero__(self):
        return False
于 2010-02-10T01:24:23.073 回答
68

如果你想让你的代码与 python3 前向兼容,你可以做这样的事情

class test:
    def __bool__(self):
        return False
    __nonzero__=__bool__
于 2010-02-10T01:37:04.047 回答
10

如果您的test类是类似列表的,如果有 1+ 个项目(非空列表)和0 个项目(空列表) ,则定义__len__bool(myInstanceOfTest)返回。这对我有用。TrueFalse

class MinPriorityQueue(object):
    def __init__(self, iterable):
        self.priorityQueue = heapq.heapify(iterable)
    def __len__(self):
        return len(self.priorityQueue)

>>> bool(MinPriorityQueue([])
False
>>> bool(MinPriorityQueue([1,3,2])
True
于 2013-11-19T00:46:08.310 回答
5

与 John La Rooy 类似,我使用:

class Test(object):
    def __bool__(self):
        return False

    def __nonzero__(self):
        return self.__bool__()
于 2016-08-24T20:09:22.870 回答
4

test.__nonzero__()

于 2010-02-10T01:23:55.633 回答
2

[这是对@john-la-rooy 答案的评论,但我还不能评论:)]

对于 Python3 兼容性,您可以这样做(我一直在寻找这个)

class test(object):
    def __bool__(self):
        return False

    __nonzero__=__bool__

__nonzero__ = __bool__唯一的问题是每次更改子类时都需要重复__bool__。否则__nonzero__将被超类保留。你可以试试

from builtins import object  # needs to be installed !

class test(object):
    def __bool__(self):
        return False

    __nonzero__=__bool__

这应该可以工作(未确认)或自己编写元类:)。

于 2016-11-04T10:06:58.420 回答