Wozu "self"?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

helduel hat geschrieben:Natürlich soll die Funktion nicht plötzlich ein zusätzliches Argument besitzen (wie GvR das angenommen hat), das keiner sieht, sondern ich denke eher in die Richtung eines zusätzlichen Schlüsselwortes (dann könnte ich auch eine Funktion außerhalb meiner Klasse definieren in später an sie ranpappen -> self wäre vorhanden). Dass man das nicht will, ist völlig ok
Hm, meinst du jetzt das hier..?

Code: Alles auswählen

>>> class Test: pass

>>> def test(self):
	print "test"

	
>>> Test.test=test
>>> del test
>>> t = Test()
>>> t.test()
test
>>> 
lunar

helduel hat geschrieben:Nur, es geht um die Frage, ob man es nicht weglassen könnte und da muss man sagen: Natürlich ginge das. Andere Sprachen können das ja auch.
Das sagt genau gar nichts aus. Es geht ja nicht darum, ob man die Referenz auf das Objekt selbst in anderen Sprachen implizieren kann, sondern ob das in Python möglich ist. Sicherlich kommen andere Sprachen wie C++ ohne eine explizite Angabe dieser Referenz aus. Dies allerdings auf Python zu übertragen und als Argument für die technische Möglichkeit anzuwenden, setzt voraus, dass diese Sprachen in ihrem Objektmodell Python gleichen.

Das ist aber definitiv nicht der Fall. C++ beispielsweise kommt zwar ohne explizites "this" aus, allerdings sind Funktionen und Methoden in C++ auch etwas fundamental verschiedenes. Auch kennt C++ keine Dekoratoren oder Methodenreferenzen. Daher treten die Probleme der Implikation, die bei Python immanent sind, unter C++ überhaupt nicht auf, weil die Sprache dies durch ihre Definition verhindert.

Bei Python ginge das aber mit tiefgreifenden Änderungen (Compiler, Bibliotheken) einher
Es ginge auch und vor allem mit größeren Änderungen am Objektmodell und der Sprachspezifikation einher, da man bei den erwähnten Problemfällen (vor allem bei Dekoratoren) genau definieren müsste, wann eine Methode oder Funktion eine implizite Referenz erhält. Man kann ja beispielsweise Funktionen einfach als Dekoratoren verwenden, genauso wie man Methoden außerhalb der Klassendeklaration ersetzen kann. Die daraus resultierenden Regeln wären mit Sicherheit komplex und stünden den Prinzipien von Python somit entgegen.
I reject hacks like special-casing '@classmethod' and '@staticmethod'.
Ob eine Funktion im Kontext einer Klasse (implizites cls innerhalb der Funktion) oder im Kontext einer Instanz (implizites self innerhalb der Funktion) aufgerufen wurde - die Info wäre da (wenn auch nicht zur Compile-Zeit) und könnte ausgewertet werden.
Wenn diese Information zur Laufzeit ausgewertet würde, stellt sich die Frage, was passiert, wenn keine Klassenmethode im Kontext einer Instanz aufgerufen wird.
Das technische Geblubber mag momentan relevant sein, weil man die Technik nicht von heute auf morgen ändern kann, aber auf Dauer gesehen, könnte man die in den Griff kriegen.
Ohne Änderungen am Objektmodell ist das nicht so einfach. Natürlich kann man das Objektmodell ändern – das von Java kommt ja auch ohne explizites self aus ;)
Antworten