覆盖自定义类的bool()

所有我想要的是为bool(myInstance)返回False(和myInstance评估为False时,如条件,如果/ / /和。我知道如何覆盖>,<,=)

我试过这个:

class test: def __bool__(self): return False myInst = test() print bool(myInst) #prints "True" print myInst.__bool__() #prints "False" 

有什么build议么?

(我正在使用Python 2.6)

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

 class test: def __nonzero__(self): return False 

如果你想保持你的代码与python3兼容,你可以这样做

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

test.__nonzero__()

如果testing是列表式的,则定义len和bool(myInstanceOfTest)将返回True / False,如果有1+或0个项目。 这对我有效。

 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 

与John La Rooy类似,我使用:

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

[这是对@ 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__ 

这应该工作(不确认)或自己写一个元类:)。