2015-07-01 7 views
7

Klasa child dziedziczy z klasy parent. Wewnątrz konstruktora child inicjuję zmienną składową list -typu xs przez wielokrotne wywoływanie funkcji składowej foo() zdefiniowanej w parent. Okazuje się, że jeśli zainicjuję xs przez jawne zapętlenie i dołączenie każdej wartości zwróconej przez foo(), wszystko działa poprawnie.Nie można wywołać metody rodzica w zrozumieniu listy w inicjatorze potomnym, ale jawna pętla działa

Jeśli jednak spróbuję zrobić to samo w ramach rozumienia listy, dostaję dziwny błąd. Dlaczego ten błąd występuje? Jaka jest różnica między rozumieniem listy w tym przypadku, a jawną pętlą?

MWE do kodu, który działa:

class parent(object): 
    def __init__(self): 
     self.x = 5 

    def foo(self, a): 
     return self.x 


class child(parent): 
    def __init__(self): 
     super().__init__() 

     self.xs = [] 
     for i in range(9): 
      self.xs.append(super().foo(i))  

mychild = child() 

Definicja child ale z listowego:

class child(parent): 
    def __init__(self): 
     super().__init__() 
     self.xs = [super().foo(i) for i in range(9)] 

błąd w pytaniu:

% python test.py 
Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    mychild = child() 
    File "test.py", line 17, in __init__ 
    self.xs = [super().foo(i) for i in range(9)] 
    File "test.py", line 17, in <listcomp> 
    self.xs = [super().foo(i) for i in range(9)] 
TypeError: super(type, obj): obj must be an instance or subtype of type 
zsh: exit 1  python test.py 

Odpowiedz

6

Lista Zrozumienie odbywa się w osobnym zakresie (patrz np. Why is one class variable not defined in list comprehension but another is?), więc domniemana forma super bez żadnych argumentów nie będzie działała w zrozumieniu listy.

Masz dwie opcje, zakładając, że nie chcesz, aby wrócić do standardowego for pętli:

  1. Użyj wyraźną formę super, przekazując argumenty klasy i instancji: super(child, self).foo(i); lub
  2. Po odziedziczeniu foo z parent wystarczy wywołać to na instancji: self.foo(i).
Powiązane problemy