Подтвердить что ты не робот

Переопределение bool() для пользовательского класса

Все, что я хочу, это для 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)

4b9b3361

Ответ 1

Является ли это Python 2.x или Python 3.x? Для Python 2.x вы хотите вместо этого заменить __nonzero__.

class test:
    def __nonzero__(self):
        return False

Ответ 2

Если вы хотите, чтобы ваш код был совместим с python3, вы могли бы сделать что-то вроде этого

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

Ответ 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

Ответ 5

Как и Джон Ла Рой, я использую:

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

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

Ответ 6

[это комментарий к ответу от @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__

который должен работать (не подтвержден) или писать метакласс:) самостоятельно.