2010-02-10 10 views
39

Tutto quello che voglio è per bool (myInstance) per restituire False (e per myInstance per valutare su False quando in un condizionale come se/o/e. So come sovrascrivere>, <, =)override bool() per classe personalizzata

ho provato questo:

class test: 
    def __bool__(self): 
     return False 

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

Qualche suggerimento?

(sto usando Python 2,6)

risposta

56

È questo 2.x Python o Python 3.x? Per Python 2.x invece stai cercando di sovrascrivere __nonzero__.

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

Grazie per questo ... Stavo cercando un modo per testare il metodo di classe '__nonzero__' per [testing' False' qui] (https://github.com/trinitronx/python_koans/commit/2fe356926fef8e615b06fe7aaaa9a844536e58b5) – TrinitronX

49

Se si desidera mantenere il vostro codice in avanti compatibile con python3 si potrebbe fare qualcosa di simile

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

se il test è la lista simile, definire len e bool (myInstanceOfTest) restituirà vero/False se ci sono 1+ o 0 elementi. Questo ha funzionato per me.

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

Questo è utile. Grazie per questa soluzione alternativa. – Ponkadoodle

1

Simile a John La Rooy, io uso:

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

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

[Questo è un commento alla risposta da @ john-la-Rooy, ma non posso commentare ancora :)]

per la compatibilità python3 si può fare (ero alla ricerca di questo)

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

    __nonzero__=__bool__ 

unico problema è che è necessario ripetere la __nonzero__ = __bool__ ogni volta che si modifica __bool__ in sottoclassi. Altrimenti, __nonzero__ verrà trattenuto dalla superclasse. Puoi provare

from builtins import object # needs to be installed ! 

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

    __nonzero__=__bool__ 

che dovrebbe funzionare (non confermato) o scrivere un metaclass :) tu stesso.

+0

Oppure usa l'approccio di tknickman per evitare questo problema. Tuttavia aggiungerà un'altra chiamata di funzione! – jhp

Problemi correlati