1) Warum ist self
ein expliziter Parameter in Methodensignaturen erforderlich?
Weil Methoden Funktionen sind und foo.bar(baz)
nur syntaktischer Zucker für bar(foo, baz)
. Klassen sind nur Wörterbücher, in denen einige der Werte Funktionen sind. (Konstruktoren sind auch nur Funktionen, weshalb Python nicht benötigt wird. new
) Man kann sagen, dass Python deutlich macht, dass Objekte aus einfacheren Komponenten erstellt werden. Dies steht im Einklang mit der Philosophie "explizit ist besser als implizit".
Im Gegensatz dazu sind Objekte in Java wirklich magisch und können nicht auf einfachere Komponenten in der Sprache reduziert werden. In Java (zumindest bis Java 8) ist eine Funktion immer eine Methode, die einem Objekt gehört, und diese Eigenschaft kann aufgrund der statischen Natur der Sprache nicht geändert werden. Daher gibt es keine Unklarheit darüber, worauf es sich this
bezieht, daher ist es sinnvoll, es implizit definieren zu lassen.
JavaScript ist ein Beispiel für eine Sprache, die implizit this
wie Java ist, bei der Funktionen jedoch getrennt von Objekten wie in Python vorhanden sein können. Dies führt zu großer Verwirrung darüber, worauf es this
ankommt, wenn Funktionen in verschiedenen Kontexten herumgereicht und aufgerufen werden. Viele denken instinktiv, dass sie this
sich auf eine intrinsische Eigenschaft der Funktion beziehen müssen, während sie tatsächlich nur durch die Art und Weise bestimmt wird, wie die Funktion aufgerufen wird. Ich glaube, dass this
ein expliziter Parameter wie in Python dies viel weniger verwirrend machen würde.
Einige andere Vorteile des expliziten self
Parameters:
Dekorateure sind nur Funktionen, die andere Funktionen einschließen. Da Methoden nur Funktionen sind, funktionieren Dekoratoren bei Methoden genauso gut. Wenn es eine Art implizites Selbst gäbe, würden Dekorateure nicht transparent an Methoden arbeiten.
Klassenmethoden und statische Methoden akzeptieren keinen Instanzparameter. Klassenmethoden verwenden eine Klasse als erstes Argument (normalerweise aufgerufen cls
). Das explizite self
oder die cls
Parameter machen viel klarer, was los ist und worauf Sie in der Methode zugreifen können.
2) Warum müssen Instanzvariablen immer mit "qualifiziert werden self.
?
In Java müssen Sie Mitgliedsvariablen nicht " this.
" voranstellen , in Python self.
ist jedoch immer " " erforderlich. Der Grund dafür ist, dass Python keine explizite Syntax zum Deklarieren von Variablen hat. Daher kann nicht festgestellt werden, ob x = 7
eine neue lokale Variable deklariert oder einer Mitgliedsvariablen zugewiesen werden soll. Das Angeben self.
löst diese Mehrdeutigkeit.