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