2010-09-27 18 views
19

Etwas, das ich die Leute sehen, die ganze Zeit zu tun ist:Aufschalten eines Methoden der Elternklasse

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. 

Etwas, das ich die Leute nie sehen zu tun ist:

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. 

Das ist, weil ich mit allen hängen falsche Programmierer, oder ist es aus einem guten Grund?

+24

Der Rückgabewert von 'ExcitingMan.say_hi()' ist oft zu aufregend für die meisten Prozessoren. – intuited

Antwort

8

Ich würde argumentieren, dass die explizite Rückgabe des Rückgabewerts der Super-Klasse-Methode vorsichtiger ist (außer in dem seltenen Fall, wo das Kind es unterdrücken möchte). Vor allem, wenn du nicht weißt was genau Super macht. Einverstanden, in Python kann man normalerweise die Super-Klassen-Methode nachschlagen und herausfinden, was es tut, aber trotzdem.

Natürlich könnten die Leute, die die andere Version geschrieben haben, die Elternklasse selbst geschrieben haben und/oder wissen, dass sie keinen Rückgabewert hat. In diesem Fall hätten sie sich entschieden, auf eine explizite Erklärung zu verzichten.

3

Ich würde vermuten, dass, zumindest in diesem Fall, da die Elternfunktion nichts zurückgibt, es keinen Sinn hat, das Ergebnis zurückzugeben. Im Allgemeinen jedoch, wenn die Elternfunktion etwas zurückgibt, halte ich das für eine gute Übung.

Wirklich, ob Sie zurückgeben, was die Superklasse tut, hängt davon ab, was genau Sie den Code tun möchten. Tun Sie es, wenn es das ist, was Sie wollen und was angemessen ist.

5

In dem Beispiel geben Sie an, dass die übergeordnete Klassenmethode keine explizite return-Anweisung hat und daher None zurückgibt. In diesem Fall gibt es kein unmittelbares Problem. Aber beachten Sie, dass jemand, der den Elternteil modifiziert, um einen Wert zurückzugeben, jetzt wahrscheinlich jedes Kind ändern muss.

Ich denke, dass Ihr Vorschlag richtig ist.