2012-03-20 30 views
12

If en Python le permite hacer algo como:clase Asignar valor booleano en Python

if not x: 
     print "X is false." 

Esto funciona si está utilizando una lista vacía, un diccionario vacío, Ninguno, 0, etc, pero lo si tienes tu propia clase personalizada? ¿Puedes asignar un valor falso para esa clase para que en el mismo estilo de condicional, devuelva falso?

Respuesta

20

Debe implementar el método __nonzero__ en su clase. Esto debería devolver Verdadero o Falso para determinar el valor de verdad:

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' 

Si __nonzero__ no se ha definido, la aplicación llamará __len__ y la instancia se considerará cierto si se devuelve un valor distinto de cero. Si no se ha definido __len__, todas las instancias se considerarán Verdaderas.

En Python 3, se utiliza __bool__ en lugar de __nonzero__.

+6

Tenga en cuenta que es '__bool__' en Python 3. – delnan

+0

@delnan: Gracias, agregado a mi respuesta. – interjay

+0

¿Funcionará esto solo si tengo() al final? Esperaba un método que funcionara tanto si el elemento era una lista vacía, un 0, como si una instancia de mi objeto era falsa. Los miembros de esta clase, enteros, cadenas, etc., estarán en una lista. Necesito una manera de probar universalmente si alguno de ellos es 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 

O, si quieres ser ultra portátil, puede definir __len__ única, la cual tendrá el mismo efecto en los dos idiomas, pero que tiene el (potencial) la desventaja que implica que el objeto tiene una medida significativa de la longitud (que puede no).

Esto funcionará para cualquier instancia, dependiendo de la lógica real que ponga en el método.

+3

Downvoter: Muéstrate. – Marcin

+1

"implica que su objeto tiene una medida significativa de longitud", palabras verdaderas de sabiduría acerca de la semántica aquí. – TaylorMac

Cuestiones relacionadas