1338 Stimmen

Was ist der Zweck des Wortes 'self'?

Was ist der Zweck von self in Python? Ich verstehe, dass es sich auf das spezifische Objektinstanz bezieht, die aus dieser Klasse erstellt wurde. Aber warum muss es explizit als Parameter zu jeder Methode hinzugefügt werden?

Zur Veranschaulichung, in Ruby kann ich dies tun:

class MyClass
    def func(name)
        @name = name
    end

In Python muss ich jedoch self einschließen:

class MyClass:
    def func(self, name):
        self.name = name

797voto

Thomas Wouters Punkte 124421

Der Grund, warum Sie self. verwenden müssen, ist, weil Python nicht die Syntax @ verwendet, um auf Instanzattribute zu verweisen. Python hat sich für eine Methode entschieden, bei der automatisch die Instanz, zu der die Methode gehört, übergeben wird, jedoch nicht automatisch empfangen wird: Der erste Parameter von Methoden ist die Instanz, auf die die Methode aufgerufen wird. Das macht Methoden vollkommen identisch mit Funktionen und überlässt es Ihnen, den tatsächlichen Namen zu verwenden (obwohl self die Konvention ist und die Leute Sie im Allgemeinen missbilligen werden, wenn Sie etwas anderes verwenden). self ist nicht speziell für den Code, es ist einfach ein weiteres Objekt.

Python hätte etwas anderes machen können, um normale Namen von Attributen zu unterscheiden - eine spezielle Syntax wie Ruby, Deklarationen wie C++ und Java oder vielleicht etwas noch ganz anderes - aber das hat es nicht getan. Python ist ganz dafür, die Dinge explizit zu machen, damit klar ist, was was ist, und obwohl es dies nicht überall vollständig tut, tut es dies für Instanzattribute. Das ist der Grund, warum beim Zuweisen zu einem Instanzattribut bekannt sein muss, zu welcher Instanz zugewiesen werden soll, und deshalb self. benötigt wird.

639voto

Arjun Sreedharan Punkte 10254

Sagen wir, Sie haben eine Klasse ClassA, die eine Methode methodA enthält, definiert als:

def methodA(self, arg1, arg2):
    # etwas tun

und ObjectA ist eine Instanz dieser Klasse.

Wenn nun ObjectA.methodA(arg1, arg2) aufgerufen wird, konvertiert Python es intern für Sie als:

ClassA.methodA(ObjectA, arg1, arg2)

Die Variable self bezieht sich auf das Objekt selbst.

442voto

Debilski Punkte 65106

Wir nehmen eine einfache Vektor-Klasse:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

Wir möchten eine Methode haben, die die Länge berechnet. Wie sähe es aus, wenn wir sie innerhalb der Klasse definieren würden?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

Wie sähe es aus, wenn wir sie als globale Methode/Funktion definieren würden?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

Also bleibt die gesamte Struktur gleich. Wie können wir das nutzen? Wenn wir kurz annehmen, dass wir keine length Methode für unsere Vector Klasse geschrieben hätten, könnten wir Folgendes tun:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

Dies funktioniert, weil der erste Parameter von length_global als der self Parameter in length_new verwendet werden kann. Dies wäre ohne ein explizites self nicht möglich.


Ein weiterer Weg, um die Notwendigkeit des expliziten self zu verstehen, ist zu sehen, wo Python etwas syntaktischen Zucker hinzufügt. Wenn man bedenkt, dass im Grunde genommen ein Aufruf wie

v_instance.length()

intern in

Vector.length(v_instance)

umgewandelt wird, ist leicht zu erkennen, wo das self passt. In Python schreibt man eigentlich keine Instanzmethoden; was man schreibt, sind Klassenmethoden, die eine Instanz als ersten Parameter entgegennehmen müssen. Daher müssen Sie den Instanzparameter irgendwo explizit platzieren.

254voto

sw123456 Punkte 3163

Beim Instanziieren von Objekten wird das Objekt selbst in den self-Parameter übergeben.

Geben Sie hier eine Bildbeschreibung ein

Dadurch ist die Daten des Objekts an das Objekt gebunden. Im Folgenden finden Sie ein Beispiel, wie Sie sich vorstellen können, wie die Daten jedes Objekts aussehen könnten. Beachten Sie, wie "self" durch den Namen der Objekte ersetzt wird. Ich sage nicht, dass das folgende Beispieldiagramm vollkommen genau ist, aber hoffentlich dient es dazu, die Verwendung von self zu visualisieren.

Geben Sie hier eine Bildbeschreibung ein

Das Objekt wird in den self-Parameter übergeben, damit das Objekt seine eigenen Daten behalten kann.

Obwohl dies möglicherweise nicht vollständig genau ist, denken Sie beim Prozess des Instanziierens eines Objekts daran: Wenn ein Objekt erstellt wird, verwendet es die Klasse als Vorlage für seine eigenen Daten und Methoden. Ohne seinen eigenen Namen in den self-Parameter zu geben, würden die Attribute und Methoden in der Klasse als allgemeine Vorlage bleiben und würden nicht auf das Objekt bezogen werden. Durch das Übergeben des Namens des Objekts in den self-Parameter bedeutet dies, dass, wenn 100 Objekte aus einer Klasse instanziiert werden, alle ihre eigenen Daten und Methoden verfolgen können.

Sehen Sie sich die Abbildung unten an:

Geben Sie hier eine Bildbeschreibung ein

88voto

kame Punkte 18813

Ich mag dieses Beispiel:

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X