2010-02-10 16 views
39

Todo lo que quiero es que bool (myInstance) devuelva False (y que myState evalúe False cuando esté en un condicional como if/o/y. Sé cómo anular>, <, =)anulando bool() para la clase personalizada

he intentado esto:

class test: 
    def __bool__(self): 
     return False 

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

¿Alguna sugerencia?

(estoy usando Python 2,6)

Respuesta

56

¿Es esta Python 2.x 3.x o Python? Para Python 2.x, en su lugar, desea anular __nonzero__.

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

Gracias por esto ... Estaba buscando una forma de probar el método de clase '__nonzero__' para [probar' False' aquí] (https://github.com/trinitronx/python_koans/commit/2fe356926fef8e615b06fe7aaaa9a844536e58b5) – TrinitronX

49

Si desea mantener su código compatible con versiones futuras python3 que podría hacer algo como esto

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

si la prueba es-lista como, definir len y bool (myInstanceOfTest) devolverá True/False si hay 1+ o 0 elementos. Esto funcionó para mí.

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

Eso es útil. Gracias por esta solución alternativa. – Ponkadoodle

1

similares a John La Rooy, que utilizo:

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

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

[esto es un comentario a la respuesta de @ John-la-Rooy pero no puedo comentar todavía :)]

para compatibilidad python3 que puede hacer (que estaba buscando este)

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

    __nonzero__=__bool__ 

único problema es que es necesario repetir el __nonzero__ = __bool__ cada vez que cambie __bool__ en subclases. De lo contrario, __nonzero__ se mantendrá alejado de la superclase. Puede probar

from builtins import object # needs to be installed ! 

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

    __nonzero__=__bool__ 

que debería funcionar (no confirmado) o escribir una metaclase :) usted mismo.

+0

O utilice el enfoque de tknickman para evitar este problema. Sin embargo, agregará otra función llamada! – jhp