2012-07-04 13 views
5

Al inicializar el objeto Foo se ejecuta el método func(), pero el valor de self.a se establece en Ninguno de todos modos.No se pueden establecer los atributos de clase en python utilizando un método

¿Cómo puedo obtener el siguiente código para trabajar?

#!/usr/bin/env python 

class Foo(object): 

    def __init__(self, num): 
     self.a = self.func(num) 
     print self.a 

    def func(self, num): 
     self.a = range(num) 
     print self.a 

    def __str__(self): 
     return str(self.a) 


def main(): 
    f = Foo(20) 
    print f 

if __name__ == "__main__": 
    main() 

La salida es:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
None 
None 
+0

No tiene atributos de clase, solo atributos de instancia. –

Respuesta

9

que estés restablecer self.a que el valor de retorno de la función. Como la función no devuelve nada, el valor se establece en None.

def __init__(self, num): 
    self.a = self.func(num) # return value of function is None 
    print self.a    # self.a is now None 

def func(self, num): 
    self.a = range(num)  # sets self.a to [0..19] 
    print self.a    # prints [0..19] 
    # implicit "return None" 
3

jterrace es correcto. Lo que está sucediendo es que el método func() está imprimiendo primero, no el método init. Considere este programa:

#!/usr/bin/env python 

class Foo(object): 

    def __init__(self, num): 
     self.a = self.func(num) 
     print '__init__:', self.a 

    def func(self, num): 
     self.a = range(num) 
     print 'func:', self.a 

    def __str__(self): 
     return str(self.a) 

if __name__ == '__main__': 
    f = Foo(20) 
    print '__main__:', f 

Es muy similar a la suya, excepto añadí __init__:, func: y __main__: a declaraciones de impresión de la función respectiva. Ejecute esto y debe tener una mejor comprensión de lo que está sucediendo.

Cuestiones relacionadas