2013-08-08 10 views
23

W jaki sposób wywołuje się metodę więcej niż jednej klasy w górę łańcucha dziedziczenia, jeśli została nadpisana przez inną klasę po drodze?Wywołanie metody nadrzędnej jednostki nadrzędnej, która została nadpisana przez jednostkę nadrzędną.

class Grandfather(object): 
    def __init__(self): 
     pass 

    def do_thing(self): 
     # stuff 

class Father(Grandfather): 
    def __init__(self): 
     super(Father, self).__init__() 

    def do_thing(self): 
     # stuff different than Grandfather stuff 

class Son(Father): 
    def __init__(self): 
     super(Son, self).__init__() 

    def do_thing(self): 
     # how to be like Grandfather? 

Odpowiedz

23

Jeśli zawsze chcesz Grandfather#do_thing, niezależnie od tego, czy Grandfather jest Father jest natychmiastowa nadklasą następnie można jawnie wywołać Grandfather#do_thing na Sonself obiektu:

class Son(Father): 
    # ... snip ... 
    def do_thing(self): 
     Grandfather.do_thing(self) 

Z drugiej strony, jeśli chcesz aby wywołać nadklasy do_thing z klasy nadrzędnej, niezależnie od tego, czy jest to Grandfather powinieneś użyć super (jak w odpowiedzi Thierry'ego):

class Son(Father): 
    # ... snip ... 
    def do_thing(self): 
     super(Father, self).do_thing() 
+2

czy istnieje powód, aby wolą swoją odpowiedź Thierry J'S? –

+4

Użyj tego, jeśli zawsze chcesz "dziadka", niezależnie od tego, czy jest to bezpośrednia nadrzędna "ojca". Użyj Thierry'ego, jeśli chcesz superklasy ojca, bez względu na to, czy jest to "dziadek". –

19

Można to zrobić przy użyciu:

class Son(Father): 
    def __init__(self): 
     super(Son, self).__init__() 

    def do_thing(self): 
     super(Father, self).do_thing() 
+0

Po komentarzu @Sean Vieira, w tym przypadku użyjesz metody "do_thing" bezpośredniej superklasy ojca, co nie zapewnia, że ​​będzie to metoda "dziadka" (w przypadku wielokrotnej niewiedzy) – Hamlett

Powiązane problemy