In Bezug auf Python kann ich dir nichts Neues sagen. Die self
wird konventionell als erster Parameter einer Methode übergeben, wie pst sagt. Von Python-Dokumenten
Oft wird das erste Argument einer Methode als self bezeichnet. Das ist nichts weiter als eine Konvention: Der Name self hat für Python absolut keine besondere Bedeutung. Beachten Sie jedoch, dass Ihr Code für andere Python-Programmierer weniger lesbar ist, wenn Sie der Konvention nicht folgen, und es ist auch denkbar, dass ein Klassenbrowserprogramm geschrieben wird, das auf einer solchen Konvention beruht.
CRuby (oder "MRI") hat etwas ähnliches, was allerdings unter der Haube passiert. Jede C-Erweiterung kann (Modul / Klasse / Singleton) -Methoden auf einer Ruby-Klasse definieren, indem Sie
verwenden Die eigentlichen Implementierungsfunktionen nehmen immer VALUE self
als ihr erstes Argument in Analogie zum Python-Idiom. self
bezieht sich in diesen Fällen auf die Objektinstanz, an die diese bestimmte Nachricht gesendet wurde, d. h. wenn Sie
und do_sth würden in C implementiert werden, dann wäre eine entsprechende C-Funktion
%Vor% Jede solche Implementierung hat , um VALUE
(die C-Repräsentation eines Ruby-Objekts) zurückzugeben, was damit zusammenhängt, dass jeder Methodenaufruf oder Nachricht gesendet wurde ( an Smalltalk-Sprache zu halten) hat einen Rückgabewert in Ruby. In Ruby gibt es keine Funktion void
.
Obwohl wir self
im Low-Level-C-Code hin und her geben müssen, müssen Sie dies nicht im Ruby-Code tun, Ruby kümmert sich darum. Der aktuelle Wert von self wird intern in dem aktuellen Threadkontext gespeichert, der ausgeführt wird, so dass das Vorhandensein von self
gewährt wird, die Nachricht "self" wird immer für ein Objekt ausgewertet.
Aufgrund der dynamischen Natur von Ruby ändert sich der tatsächliche Wert dieses Objekts, auf das von self
verwiesen wird, mit dem aktuellen Umfang des aktuell interpretierten Codes. Führen Sie dies aus, um selbst zu sehen:
Wenn Sie eine Methode aufrufen / eine Nachricht aus einem beliebigen Kontext an self
senden möchten, können Sie dies entweder explizit tun (zB self.method
) oder% code_de% als Empfänger weglassen - dann wird per Konvention der Der implizite Empfänger der Nachricht ist self
.
Eine interessante Randnotiz ist Rubys Interpretation von self
Methoden, die sich z. aus dem Java-Konzept von private
. Rubys private Methoden können nur durch Senden einer Nachricht mit private
als impliziter Empfänger, d. H.
funktioniert, während Methode a durch
ersetzt wird %Vor%würde eine Ausnahme auslösen. Dies impliziert, dass etwas sehr häufig in Java ist
%Vor% funktioniert nicht in Ruby. Dummes Beispiel, aber nur um den Punkt zu verdeutlichen: In Java können wir auf private Methoden anderer Instanzen der gleichen Klasse zugreifen, dies wäre in Ruby nicht möglich, da wir nur auf private Methoden der aktuellen self
zugreifen können.
Um die Dinge noch etwas komplizierter zu machen, ändern die Funktionen self
und instance_eval
auch den Wert von class_eval
während der Ausführung.
Ruby und Python sind eigentlich sehr verschiedene Sprachen (obwohl sie viele Gemeinsamkeiten haben), selbst wenn Ruby eine Syntax hat, die so geschrieben werden kann, dass sie wie Python aussieht (mit end
keywords) ; -)
Ruby ist nachrichtenbasiert (es wurde stark von SmallTalk-80 beeinflusst) und "Nachrichten" werden an Objekte gesendet. Ruby unterstützt einen impliziten Empfänger (explizit als self
bekannt) für einen bestimmten Bereich. In Ruby self
ist keine Variable , sondern ein Ausdruck, der den aktuellen Objektkontext auswertet.
Python ist eigenschaftsbasiert (aus Mangel an einem besseren Begriff, den ich kenne) und ist daher SELF und JavaScript ähnlicher, da Funktionen direkt ausgeführt werden (anstelle von Nachrichten, die übergeben werden). Python hat kein self
-Schlüsselwort und es ist lediglich Konvention, dass self
als der Name des ersten Parameters einer Methode verwendet wird - so geht Python im aktuellen Objektkontext um.
Glückliche Kodierung.
In% Python ist my_instance.a_method(an_argument)
nur eine Abkürzung für MyClass.a_method(my_instance, an_argument)
. Daher sollte die Definition von MyClass.a_method
zwei Parameter haben:
Wie bereits erwähnt, ist die Verwendung des Variablennamens self
nur eine Konvention. Du könntest auch
und alles würde gleich funktionieren ... aber mach das nicht.