2010-02-10 4 views
39

Tout ce que je veux, c'est que bool (myInstance) renvoie False (et myInstance pour évaluer False quand dans un conditionnel comme si/ou/et. Je sais comment redéfinir>, <, =)overriding bool() pour la classe personnalisée

J'ai essayé ceci:

class test: 
    def __bool__(self): 
     return False 

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

Toutes les suggestions?

(J'utilise Python 2,6)

Répondre

56

Est-ce 2.x Python ou Python 3.x? Pour Python 2.x, vous cherchez à remplacer __nonzero__ à la place.

class test: 
    def __nonzero__(self): 
     return False 
+1

Merci pour cela ... Je cherchais un moyen de tester la méthode de classe '__nonzero__' pour [tester' False' ici] (https://github.com/trinitronx/python_koans/commit/2fe356926fef8e615b06fe7aaaa9a844536e58b5) – TrinitronX

5
+1

Il est court et code seulement (avec un lien) mais il répond à la question ... – rene

49

Si vous voulez garder votre code avant compatible avec python3 vous pourriez faire quelque chose comme ça

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

si le test est la liste semblable, définir len et bool (myInstanceOfTest) retourne vrai/Faux s'il y a 1+ ou 0 articles. 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 
+1

C'est pratique. Merci pour cette solution alternative. – Ponkadoodle

1

similaires à John La Rooy, j'utilise:

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

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

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

pour la compatibilité python3 vous pouvez faire (que je cherchais cette)

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

    __nonzero__=__bool__ 

le seul problème est que vous devez répéter la __nonzero__ = __bool__ chaque fois que vous modifiez __bool__ en sous-classes. Autrement __nonzero__ sera conservé de la superclasse. Vous pouvez

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 un métaclasse :) vous.

+0

Ou utilisez l'approche de tknickman pour éviter ce problème. Il va ajouter un autre appel de fonction bien! – jhp

Questions connexes