2012-03-20 1 views
12

Se le dichiarazioni in Python permette di fare qualcosa di simile:Incarica valore booleano in Python

if not x: 
     print "X is false." 

Questo funziona se si sta utilizzando una lista vuota, un dizionario vuoto, None, 0, ecc, ma che cosa se hai il tuo corso personalizzato? Puoi assegnare un valore falso per quella classe in modo che, nello stesso stile di condizionale, restituisca false?

risposta

20

È necessario implementare il metodo __nonzero__ nella classe. Ciò dovrebbe restituire True o False per determinare il valore di verità:

class MyClass(object): 
    def __init__(self, val): 
     self.val = val 
    def __nonzero__(self): 
     return self.val != 0 #This is an example, you can use any condition 

x = MyClass(0) 
if not x: 
    print 'x is false' 

Se __nonzero__ non è stato definito, l'attuazione chiamerà __len__ e l'istanza sarà considerato vero se ha restituito un valore diverso da zero. Se non è stato definito anche lo __len__, tutte le istanze verranno considerate Vero.

In Python 3, viene utilizzato __bool__ anziché __nonzero__.

+6

Si noti che è '__bool__' in Python 3. – delnan

+0

@delnan: Grazie, aggiunto alla mia risposta. – interjay

+0

Funzionerà solo se ho() alla fine di esso? Speravo in un metodo che avrebbe funzionato sia che l'elemento fosse una lista vuota, uno 0 o un'istanza del mio oggetto che fosse falsa. I membri di questa classe, interi, stringhe, ecc. Saranno tutti in una lista. Ho bisogno di un modo per testare universalmente se qualcuno di loro è falso. – Kelketek

7
class Foo: 
    def __nonzero__(self): return False 
    __bool__ = __nonzero__ # this is for python3 

In [254]: if Foo(): 
    .....:  print 'Yeah' 
    .....: else: print 'Nay' 
    .....: 
Nay 

Oppure, se si vuole essere ultra-portatile, è possibile definire __len__ solo, che avrà lo stesso effetto in entrambe le lingue, ma che ha il (potenziale) lato negativo che implica che l'oggetto ha un misura significativa della lunghezza (che potrebbe non essere).

Questo funzionerà per qualsiasi istanza, a seconda della logica effettiva inserita nel metodo.

+3

Downvoter: mostra te stesso. – Marcin

+1

"implica che il tuo oggetto ha una misura significativa della lunghezza", parole vere di saggezza sulla semantica qui. – TaylorMac