2012-07-04 18 views
5

Inicjowanie obiektu Foo uruchamia metodę func(), ale wartość self.a zostaje mimo wszystko ustawiona na None.Nie można ustawić atrybutów klasy w pythonie za pomocą metody

Jak uzyskać następujący kod?

#!/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() 

Wyjście jest:

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

Nie masz żadnych atrybutów klas, tylko atrybuty instancji. –

Odpowiedz

9

Ty resetowania self.a do wartości zwracanej przez funkcję. Ponieważ funkcja nic nie zwraca, wartość zostaje ustawiona na 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 jest poprawny. Co się dzieje, jest to, że metoda func() drukuje najpierw, a nie metoda. Rozważmy następujący program:

#!/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 

to jest bardzo podobne do Ciebie z wyjątkiem dodałem __init__:, func: i __main__: do sprawozdania drukowania odpowiednich funkcji. Uruchom to i powinieneś lepiej zrozumieć, co się dzieje.

Powiązane problemy