自定义类中重写布尔()[重复]自定义类中重写布尔()[重复](overriding bool() f

2019-05-12 04:02发布

这个问题已经在这里有一个答案:

  • 定义一个类的“boolness”在Python 3个回答

所有我想要的是布尔(将myInstance)返回false(和将myInstance评估为False时,在条件一样,如果/或/和。我知道如何重写>,<,=)

我已经试过这样:

class test:
    def __bool__(self):
        return False

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

有什么建议?

(我使用Python 2.6)

Answer 1:

这是Python的2.x或Python的3.x的? 对于Python 2.x的你正在寻找替代__nonzero__代替。

class test:
    def __nonzero__(self):
        return False


Answer 2:

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

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


Answer 3:

如果你的test类列表类似,定义__len__bool(myInstanceOfTest)将返回True如果有1+项目(非空列表)和False ,如果有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


Answer 4:

test.__nonzero__()



Answer 5:

类似约翰·拉ROOY,我使用:

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

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


Answer 6:

[这是从@约翰-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__

这应该工作(未证实)或写元类:)自己。



文章来源: overriding bool() for custom class [duplicate]