2013-04-22 12 views
5

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 C1f nazywa który wywołuje metodę C1g. 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

+3

Dodaj niektóre instrukcje 'print' do każdej funkcji, aby dowiedzieć się, co naprawdę się dzieje. –

+0

jeśli wpiszesz C3.f zobaczysz c3.f co oznacza, że ​​jest częścią klasy C3 – Greg

+0

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" –

Odpowiedz

1

obj3_calls jest ['C1.f', 'C3.g']. Jak zauważyłeś, nie ma w tej klasie C3.f, ale ta metoda jest dziedziczona po C1. Ten z kolei wywołuje self.g, a od C3.gjest zdefiniowane, to nadpisuje metodę, która jest dziedziczona z C1.

3

Jest to związane z porządkiem rozstrzygania metod (MRO) klasy. (Patrz here jakiegoś użytecznych informacji)

Jak słusznie stwierdził, nie ma C3.f funkcja, więc Python wyszukuje metodę f na pierwszej klasy bazowej w MRO, który ma f zdefiniowany. W tym przypadku jest to (C1). Teraz ta metoda (C1.f) wywołuje self.g(). W tym przypadku selfjest instancją C3, więc oczywiście, self.g dzwoni C3.g, ponieważ jest to najwyższa funkcja g w MRO. Jeśli chcesz, aby zagwarantować, że masz C1.g, trzeba by zrobić to wyraźnie:

class C1(object): 
    def f(self): 
     return 2*C1.g(self) 
    def g(self): 
     return 5 

co również sprawia, że ​​piękny lead-in, aby mówić o podwójnej podkreślenia nazwa przekręcona. Ponieważ jest to osobny temat, może najlepiej pozostawić tylko link to some useful documentation.

+0

Niesamowite, dziękuję za to i wszystkim za pomoc. teraz rozumiem –

Powiązane problemy