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

8voto

Bugs Buggy Punkte 1494

Die Verwendung des Arguments, das konventionell self genannt wird, ist nicht so schwer zu verstehen, wie warum ist es notwendig? Oder warum es explizit erwähnen? Das ist wohl eine größere Frage für die meisten Benutzer, die diese Frage nachschlagen, oder wenn nicht, werden sie sicherlich dieselbe Frage haben, wenn sie weiterhin Python lernen. Ich empfehle ihnen, diese zwei Blogs zu lesen:

1: Verwendung von self erklärt

Beachten Sie, dass es sich nicht um ein Schlüsselwort handelt.

Das erste Argument jeder Klassenmethode, einschließlich init, ist immer eine Referenz auf die aktuelle Instanz der Klasse. Konventionell wird dieses Argument immer als self bezeichnet. In der init-Methode bezieht sich self auf das neu erstellte Objekt; in anderen Klassenmethoden bezieht es sich auf die Instanz, deren Methode aufgerufen wurde. Zum Beispiel ist der unten stehende Code der gleiche wie der obige Code.

2: Warum haben wir es auf diese Weise und warum können wir es nicht als Argument eliminieren, wie Java, und stattdessen ein Schlüsselwort verwenden

Eine weitere Sache, die ich hinzufügen möchte, ist, ein optionales self-Argument ermöglicht es mir, statische Methoden innerhalb einer Klasse zu deklarieren, ohne self zu schreiben.

Codebeispiele:

class MyClass():
    def staticMethod():
        print "Dies ist eine statische Methode"

    def objectMethod(self):
        print "Dies ist eine Objektmethode, die eine Instanz einer Klasse benötigt, und darauf bezieht sich self"

PS: Dies funktioniert nur in Python 3.x.

In früheren Versionen müssen Sie explizit den @staticmethod-Dekorator hinzufügen, sonst ist das self-Argument obligatorisch.

5voto

skyking Punkte 13037

Das liegt daran, dass die Alternativen aufgrund der Gestaltung von Python kaum funktionieren würden. Python ist so konzipiert, dass Methoden oder Funktionen in einem Kontext definiert werden können, in dem weder implizites this (à la Java/C++) noch explizites @ (à la Ruby) funktionieren. Lassen Sie uns ein Beispiel mit dem expliziten Ansatz mit Python-Konventionen haben:

def fubar(x):
    self.x = x

class C:
    frob = fubar

Jetzt würde die fubar-Funktion nicht funktionieren, da angenommen wird, dass self eine globale Variable ist (und auch in frob). Die Alternative wäre, Methoden mit einem ausgetauschten globalen Scope auszuführen (in dem self das Objekt ist).

Der implizite Ansatz wäre

def fubar(x)
    myX = x

class C:
    frob = fubar

Dies würde bedeuten, dass myX als lokale Variable in fubar interpretiert würde (und auch in frob). Die Alternative hier wäre, Methoden mit einem ausgetauschten lokalen Scope auszuführen, der zwischen den Aufrufen erhalten bleibt, dies würde jedoch die Möglichkeit von lokalen Variablen in Methoden entfernen.

Die aktuelle Situation funktioniert jedoch gut:

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

hier wird frob beim Aufruf als Methode das Objekt erhalten, auf dem es aufgerufen wird, über den Parameter self, und fubar kann immer noch mit einem Objekt als Parameter aufgerufen und genauso funktionieren (es ist dasselbe wie C.frob, denke ich).

3voto

Oussama L. Punkte 1764

Im __init__ Method bezieht sich self auf das neu erstellte Objekt; in anderen Klassenmethoden bezieht es sich auf die Instanz, deren Methode aufgerufen wurde.

self als Name ist nur eine Konvention, nenne sie wie du willst! Aber wenn du sie benutzt, zum Beispiel um das Objekt zu löschen, musst du denselben Namen verwenden: __del__(var), wobei var im __init__(var,[...]) verwendet wurde.

Du solltest dir auch cls ansehen, um das große Ganze zu haben. Dieser Beitrag könnte hilfreich sein.

3voto

sameer_nubia Punkte 621

Self fungiert als aktueller Objektname oder Instanz der Klasse.

# Selbst Erklärung.

 class Klassenname(object):

    def __init__(self,name):

        self.name=name
        # Self fungiert als Ersatz für den Objektnamen.
        #self.name=object1.name

   def anzeigen(self):
      print("Name der Person ist:",self.name)
      print("Objektname:",object1.name)

 object1=Klassenname("Bucky")
 object2=Klassenname("Ford")

 object1.anzeigen()
 object2.anzeigen()

###### Output 
Name der Person ist : Bucky
Objektname: Bucky
Name der Person ist : Ford
Objektname: Bucky

2voto

Rahul Jha Punkte 646

"self" Schlüsselwort hält die Referenz der Klasse und es liegt an Ihnen, ob Sie es verwenden möchten oder nicht. Aber wenn Sie bemerken, dass, jedes Mal wenn Sie eine neue Methode in Python erstellen, Python automatisch das Schlüsselwort self für Sie schreibt. Wenn Sie etwas Recherche und Entwicklung betreiben, werden Sie feststellen, dass wenn Sie zum Beispiel zwei Methoden in einer Klasse erstellen und versuchen, eine in der anderen aufzurufen, erkennt es die Methode nicht, es sei denn, Sie fügen self hinzu (Referenz der Klasse).

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
    self.m2()
def m2(self):
    print('method 2')

Der untenstehende Code wirft einen nicht auflösbaren Referenzfehler.

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
    m2()  # wirft einen nicht auflösbaren Referenzfehler, da die Klasse nicht weiß, ob m2 im Klassenumfang existiert
def m2(self):
    print('method 2')

Jetzt schauen wir uns das folgende Beispiel an

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
def m2():
    print('method 2')

Wenn Sie jetzt ein Objekt der Klasse testA erstellen, können Sie die Methode m1() mit dem Klassenobjekt so aufrufen, da die Methode m2() das self-Schlüsselwort enthalten hat

obj = testA()
obj.m1()

Aber wenn Sie die Methode m2() aufrufen möchten, weil sie keinen self-Verweis hat, können Sie m2() direkt mit dem Klassennamen wie unten aufrufen

testA.m2()

Aber bleiben Sie in der Praxis beim self-Schlüsselwort, da es auch andere Vorteile bietet, wie das Erstellen von globalen Variablen und so weiter.

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