2014-11-15 19 views
6

(Ich bin nicht in der Lage einen Verweis überall in dieser Angelegenheit nach einiger googeln zu finden.)Wann Python Super() .__ Init __() aufrufen?

Das Szenario kann eindeutig mit diesem kurzen Codebeispiel demonstriert werden:

class X: 
    def __init__(self, stuff): 
     self.__stuff = stuff 

class Y(X): 
    def __init__(self, stuff): 
     # Is it safe to execute statements before calling super.__init__()? 
     new_stuff = self.call_another_method(stuff) 
     super(Y, self).__init__(new_stuff) 

CPython 3.x verwenden, die oben Codebeispiel funktioniert - vorausgesetzt, call_another_method() existiert. Ist dieser Codierungsstil generell sicher, aber verpönt oder unpythonisch? Ich kann in dieser Angelegenheit keinen Rat finden.

Warum interessiert mich das?

Mein Hintergrund kommt von traditionelleren objektorientierten Programmiersprachen wie C++, C# und Java, wobei "super" strikt als die erste Anweisung in einem Unterklassenkonstruktor bezeichnet werden muss, wobei der implizite Null-Argument-Fall ignoriert wird.

Wenn es darauf ankommt, bin ich jung Pythoneer: 3+, bitte.

+1

IIRC, in Python 3.x musst du 'super (ClassName, self)' nicht mehr aufrufen, 'super()' funktioniert ganz gut. –

+0

Über das einzige, was 'super' in Java und Python gemeinsam ist, ist der Name. Java 'super' ist ein Schlüsselwort, das die (einzige) Basisklasse referenziert; Python 'super' ist eine integrierte Funktion, die mithilfe ihrer Argumente ein Objekt zurückgibt, das als Proxy für eine Klasse in der Methodenauflösungsreihenfolge eines Objekts dient. – chepner

+0

@ChinmayKanchi: Danke für den Tipp. Ich werde meinen Code in Zukunft aktualisieren! – kevinarpe

Antwort

9

Ja, es ist vollkommen sicher, andere Dinge vor super() anzurufen. Python legt keine Reihenfolge fest und es gibt viele Anwendungsfälle dafür.

Beachten Sie, dass super().__init__() Aufruf ist nur ein anderer Ausdruck in Python, es ist kein Syntaxkonstrukt. Sie können auch super() externe Methoden verwenden, vorausgesetzt, Sie übergeben die richtigen Argumente.

In Ihrem Fall können Sie die Art und Instanz Argumente weglassen, Python 3 wird diese für Sie abrufen, wenn super() ohne Argumente aufgerufen wird, weil man es in einer Funktion innerhalb einer Klasse definiert werden mit:

class Y(X): 
    def __init__(self, stuff): 
     new_stuff = self.call_another_method(stuff) 
     # super(Y, self) is implicit here: 
     super().__init__(new_stuff) 
+1

Beachten Sie, dass wenn Sie in C++ den Konstruktor der Basis nicht explizit aufrufen, der Standardkonstruktor implizit aufgerufen wird. Wenn Sie es in Python nicht explizit nennen, wird es überhaupt nicht aufgerufen. "_Explicit ist besser als implizit._" – GingerPlusPlus

+0

@GingerPlusPlus: Ja. Dasselbe gilt für C# und Java (und viele andere). – kevinarpe

Verwandte Themen