Schon lange hab ich mich gefragt, wieso eigentlich mich dieser eine Punkt an Python so sehr stört:
Jede Methode eines Objektes erhÀlt als ersten Parameter eine Referenz auf das aufrufende Objekt.
Bisher konnte ich den Finger nie darauf legen konnte, wieso mir das eigentlich so auf den Keks geht. Bisher dachte ich immer das es mich stört, weil man schwieriger aus normalen Funktionen Methoden zu machen, beim Refactorn, aber so wirklich passt das nicht. Also dachte ich, vielleicht gewöhne ich mich ja irgendwann daran. Dem war aber nicht so.
Bei den Vorbereitungen zum Java-Kurs ist mir jetzt durch einen Hinweis von Robert der eigentliche Grund Aufgefallen.
Folgendes war der Auslöser: Wir haben uns gerade darĂŒber unterhalten wie wir den Studenten im Java-Kurs erklĂ€ren, wie sie this
in Java verstehen sollen.
Naja, von der technischen Seite ist das klar - die Methoden sind im Klassenobjekt implementiert und die Methode braucht aber einen Weg um an die Daten zum gegenwĂ€rtigen Instanz-Objekt zu gelangen. Also wird dieses Instanz-Objekt als verstecktes erstes Argument ĂŒbergeben, das immer den namen this
trÀgt.
Soweit so klar.
Das Mentale Bild das man von diesem Systems hat, ist aber eigentlich anders: Darin gehören die Methoden zum Instanz-Objekt und "leben" auch darin - damit ist dann auch klar, wieso eine Instanz-Methode zugriff auf die Daten des Objekts hat und wieso zum Beispiel eine Klassen-Methode das nicht kann - sie lebt einfach im falschen Objekt.
Der Knackpunkt: this
ist eigentlich ein Workaround (aber ein notwendiger) der zeigt wie diese Abstraktion implementiert wurde, der aber auch erlaubt eindeutig zu spezifizieren welchen Namensraum man jetzt meint. Jetzt möchte man aber die Implementierung möglichst von der Benutzung abstrahieren, damit man gut auf dieser Abstrakteren Ebene arbeiten kann und diese nicht stÀndig verlÀsst. Daher macht es viel Sinn diese Implementierung so transparent zu machen wie nur irgend möglich.
In Python dagegen ist das anders. Hier wird ganz Explizit immer self
als erster Parameter geschrieben. Der Effekt? StĂ€ndig wird man daran erinnert das die Abstraktion eigentlich nicht so ist wie man sich das denkt und es tatsĂ€chlich alles anders implementiert ist in Python. Das Problem? Man erhĂ€lt durch diesen Abstraktionsbruch keinen Vorteil - ja, alles ist expliziter, aber es bricht auch stĂ€ndig mit der Abstraktionsschicht auf der man Arbeitet. Details der Implementierung "bluten" ĂŒber dieses "Loch" in den ganzen Code den man schreibt.
Und saubere, klar getrennte Abstraktions-Ebenen sind einfach wichtiger als einfachste Implementierung - speziell fĂŒr einen Sprachdesigner.