Ktoś miał ten sam problem na tej stronie, ale odpowiedź nie dotyczyła części, z którą mam problem.
Dziedziczenie - wywołania metodProblemy z dziedziczeniem. - Python
Rozważ następujące definicje klas.
class C1(object):
def f(self):
return 2*self.g()
def g(self):
return 2
class C2(C1):
def f(self):
return 3*self.g()
class C3(C1):
def g(self):
return 5
class C4(C3):
def f(self):
return 7*self.g()
obj1 = C1()
obj2 = C2()
obj3 = C3()
obj4 = C4()
tego problemu są do rozważenia, które metody są nazywane, gdy metoda f
nazywa. Tak na przykład, gdy obj1.f()
nazywa, metoda C1
f
nazywa który wywołuje metodę C1
g
. To może być reprezentowana jako „listy wywołującego” formularza
['C1.f', 'C1.g']
napisanie trzech instrukcji przypisania, że odpowiednio przypisuje „list wzywający” dla obj2.f()
do zmiennej obj2_calls
, przypisuje „listy wzywające” dla obj3.f()
do zmienna obj3_calls
i przypisuje "listę połączeń" dla obj4.f()
do zmiennej obj4_calls
.
Nie mam problemu ze zrozumieniem pierwszego zadania, to jest obj2_calls = ['C2.f', 'C1.g']
, ale niszczy mój mózg, próbując znaleźć następny. Pomyślałem, że ponieważ nie ma C3.f
, lista będzie ['C1.f']
, ale niestety nie jest.
Wystarczy, aby wyjaśnić, jest to praca domowa
Dodaj niektóre instrukcje 'print' do każdej funkcji, aby dowiedzieć się, co naprawdę się dzieje. –
jeśli wpiszesz C3.f zobaczysz c3.f co oznacza, że jest częścią klasy C3 –
Greg
Cześć wam bardzo pomocni, używając print mam poprawną odpowiedź. Ale użyłem bardziej zdrowego rozsądku, niż rozumieć kod. Chciałbym jeszcze zrozumieć, dlaczego odpowiedź brzmi: obj3_calls = ['C1.f', 'C3.g'].Nie rozumiem, dlaczego "c3.g" jest wywoływane po "c1.f" –