2010-09-27 18 views
19

Coś widzę ludzi, którzy robią cały czas jest:Zastępowanie metod klasie dominującej

class Man(object): 
    def say_hi(self): 
     print('Hello, World.') 

class ExcitingMan(Man): 
    def say_hi(self): 
     print('Wow!') 
     super(ExcitingMan, self).say_hi() # Calling the parent version once done with custom stuff. 

Coś, co nigdy nie widzę ludzi, którzy robią to:

class Man(object): 
    def say_hi(self): 
     print('Hello, World.') 

class ExcitingMan(Man): 
    def say_hi(self): 
     print('Wow!') 
     return super(ExcitingMan, self).say_hi() # Returning the value of the call, so as to fulfill the parent class's contract. 

Czy to dlatego, że wiszą ze wszystkimi złych programistów, czy jest to dobry powód?

+24

Zwracana wartość 'ExcitingMan.say_hi()' jest często zbyt ekscytująca, aby mogła obsłużyć większość procesorów. – intuited

Odpowiedz

8

Twierdzę, że wyraźne zwracanie wartości zwracanej z metody super klasy jest bardziej rozważne (z wyjątkiem rzadkiego przypadku, gdy dziecko chce je zignorować). Zwłaszcza, gdy nie wiesz, co dokładnie robi super. Zgoda, w Pythonie zazwyczaj można wyszukać metodę super klasy i dowiedzieć się, co robi, ale nadal.

Oczywiście ludzie, którzy napisali inną wersję, mogli napisać klasę rodzica sami i/lub wiadomo, że nie ma ona wartości zwracanej. W takim przypadku zdecydowaliby się na bezowocne i wyraźne oświadczenie zwrotne.

3

Podejrzewam, że przynajmniej w tym przypadku, ponieważ funkcja macierzysta niczego nie zwraca, nie ma sensu zwracać jej wyniku. Generalnie jednak, gdy funkcja rodzica zwraca coś, myślę, że to dobra praktyka.

Naprawdę, to, czy zwrócisz to, co robi super klasa, zależy od tego, co dokładnie chcesz zrobić. Zrób to, jeśli jest to, czego chcesz i co jest właściwe.

5

W podanym przykładzie metoda nadrzędna nie zawiera wyraźnej instrukcji return i dlatego zwraca None. W tym przypadku nie ma natychmiastowego problemu. Zauważ, że jeśli ktoś zmodyfikuje rodzica, zwróci wartość, którą prawdopodobnie musimy teraz zmodyfikować dla każdego dziecka.

Myślę, że Twoja sugestia jest poprawna.