web-dev-qa-db-fra.com

remplacement de bool () pour la classe personnalisée

Tout ce que je veux, c'est que bool (myInstance) renvoie False (et que myInstance soit évalué à False dans un conditionnel comme si/ou/et. Je sais comment remplacer>, <, =)

J'ai essayé ça:

class test:
    def __bool__(self):
        return False

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

Aucune suggestion?

(J'utilise Python 2.6)

51
Ponkadoodle

Est-ce Python 2.x ou Python 3.x? Pour Python 2.x vous cherchez à remplacer __nonzero__ au lieu.

class test:
    def __nonzero__(self):
        return False
66
Joe Holloway

Si vous voulez garder votre code compatible avec python3, vous pouvez faire quelque chose comme ça

class test:
    def __bool__(self):
        return False
    __nonzero__=__bool__
59
John La Rooy

Si votre classe test ressemble à une liste, définissez __len__ Et bool(myInstanceOfTest) renverra True s'il y a 1+ éléments (liste non vide) et False s'il y a 0 éléments (liste vide). Cela a fonctionné pour moi.

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
9
IceArdor
4

Semblable à John La Rooy, j'utilise:

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

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

[ceci est un commentaire à la réponse de @ john-la-rooy mais je ne peux pas encore commenter :)]

Pour la compatibilité Python3, vous pouvez le faire (je cherchais cela)

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

    __nonzero__=__bool__

le seul problème est que vous devez répéter le __nonzero__ = __bool__ chaque fois que vous changez __bool__ dans les sous-classes. Autrement __nonzero__ sera conservé de la superclasse. Tu peux essayer

from builtins import object  # needs to be installed !

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

    __nonzero__=__bool__

qui devrait fonctionner (non confirmé) ou écrire une métaclasse :) vous-même.

2
jhp