覆盖自定义类的bool()

时间:2010-02-10 01:20:48

标签: python class casting boolean python-2.x

我想要的只是bool(myInstance)返回False(并且在条件中myInstance评估为False,如if /或/和。我知道如何覆盖>,<,=)

我试过这个:

class test:
    def __bool__(self):
        return False

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

有什么建议吗?

(我正在使用Python 2.6)

6 个答案:

答案 0 :(得分:64)

这是Python 2.x还是Python 3.x?对于Python 2.x,您希望改为覆盖__nonzero__

class test:
    def __nonzero__(self):
        return False

答案 1 :(得分:58)

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

class test:
    def __bool__(self):
        return False
    __nonzero__=__bool__

答案 2 :(得分:8)

如果您的test类与列表类似,则定义__len__,如果有1个项目(非空列表)和{{{},bool(myInstanceOfTest)将返回True 1}}如果有0项(空列表)。这对我有用。

False

答案 3 :(得分:5)

答案 4 :(得分:2)

与John La Rooy类似,我使用:

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

    def __nonzero__(self):
        return self.__bool__()

答案 5 :(得分: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__

哪个应该可以工作(未确认)或自己写一个元类:)。