2009-07-06 25 views
27

Como sabemos, Python tiene valores booleanos para los objetos: Si una clase tiene un método __len__, cada instancia de ella para que __len__() sucede para volver 0 será evaluado como un booleano False (por ejemplo, la lista vacía).valor booleano de objetos en Python

De hecho, cada objeto personalizado iterable, vacío se evalúa como False si aparece en la expresión booleana.

Ahora supongamos que tengo una clase foo con el atributo bar. ¿Cómo puedo definir su valor de verdad para que, por ejemplo, se evalúe a True if bar % 2 == 0 y False de lo contrario?

Por ejemplo:

myfoo = foo() 
myfoo.bar = 3 
def a(myfoo): 
    if foo: 
     print "spam" 
    else: 
     print "eggs" 

es así, debe imprimir a(myfoo)"eggs".

+0

Véase también: '__nonzero __()' –

Respuesta

34

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() 
38

En Python 3.0 <:

Usted tiene que usar __nonzero__ para lograr lo que quiere. Es un método que Python llama automáticamente al evaluar un objeto en un contexto booleano. Debe devolver un valor booleano que se usará como valor para evaluar.

por ejemplo:

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:

mismo, excepto que el método se ha cambiado el nombre a la mucho más evidente __bool__.

+4

¿Funcionará '__nonzero__' en Python> = 3.0? – Wolf

+1

@Lobo, no, no lo hará. – Hammerite

Cuestiones relacionadas