operadores - Valor booleano de objetos en Python
valores booleanos y operaciones logicas (2)
Consulte los documentos de Python para __nonzero__
.
class foo(object):
def __nonzero__( self) :
return self.bar % 2 == 0
def a(foo):
if foo:
print "spam"
else:
print "eggs"
def main():
myfoo = foo()
myfoo.bar = 3
a(myfoo)
if __name__ == "__main__":
main()
Como sabemos, Python tiene valores booleanos para los objetos: si una clase tiene un método __len__
, cada instancia para la cual __len__()
devuelve 0 se evaluará como un False
booleano (por ejemplo, la lista vacía).
De hecho, cada objeto personalizado, vacío e iterable, se evalúa como False
si aparece en una expresión booleana.
Ahora supongamos que tengo una clase foo
con la bar
atributos. ¿Cómo puedo definir su valor de verdad, de modo que, digamos, se evaluará como True if bar % 2 == 0
y False
caso contrario?
Por ejemplo:
myfoo = foo()
myfoo.bar = 3
def a(myfoo):
if foo:
print "spam"
else:
print "eggs"
entonces, a(myfoo)
debería imprimir "eggs"
.
En Python <3.0:
Tienes que usar __nonzero__
para lograr lo que quieres. Es un método que Python invoca automáticamente al evaluar un objeto en un contexto booleano. Debe devolver un valor booleano que se utilizará como valor para evaluar.
P.EJ :
class Foo(object):
def __init__(self, bar) :
self.bar = bar
def __nonzero__(self) :
return self.bar % 2 == 0
if __name__ == "__main__":
if (Foo(2)) : print "yess !"
En Python => 3.0:
Lo mismo, excepto que el método ha sido renombrado a __bool__
mucho más obvio.