Python "self" command?

4 Antworten

Self scheint mir, ähnlich wie in Pascal, ein Rückbezug auf die aktuelle Instanz zu sein.

Innherhalb der Instanz kannst du diese mittels Self referenzieren.
Es kann sein, dass diese Nice-To-Have ist, d. h. automatisch davon ausgegangen wird, dass ein objektloser Methodenaufruf sich auf die aktuelle Instanz bezieht, nur mit dem Schlüsselwort machst du es dann nochmal ganz deutlich.

Woher ich das weiß:Berufserfahrung – Programmierer

Ich erkläre das jetzt mal ohne Fachwörter. Die Basics kannst du?
Vorab: Was ich hier Funktionen nenne, nennt man auch Methoden!

Hier mach ich mal ne kleine Beispielklasse:

class erklarung:
     def __init__(self):
             self.HisName = "Fido"
     def get_new_name(self):
             self.HisName = input("Neuer Name: ")
             return self.HisName
erk = erklarung()
print("Er hieß mal " + erk.HisName + " doch jetzt heißt er " + erk.get_new_name())

Ich glaub der Code ist falsch formatiert, aber egal jetzt.
Ich geh jede Linie durch, frag wenn du Fragen hast.

Linie1 (class erklarung): In dieser Zeile sagen wir "Hey, ich will eine neue Klasse namens erklarung".

Linie2 (def __init__(self)): In dieser Zeile machen wir eine Funktion für die Klasse. Eine Klasse ist, falls du es nicht weißt, eine Sammlung von Funktionen. Die "__init__" methode, ist eine besondere Funktion. Sie wird immer 1. Mal Aufgerufen sobald die Klasse aufgerufen wird. Dazu sag ich nachher noch was. In der Klammer haben wir "self". Du kannst mit self eine Variable erstellen, unsere heißt diesmal HisName. Das tolle an self ist, dass wir auf diese Variable dann von überall aus zugriff haben.

Linie3(self.HisName = "Fido"): Da kommen wir zu deiner Frage. Hier erstellen wir wie bei der Erklärung von Linie2 schon gesagt eine Variable mit self. Jetzt haben wir eine Variable, auf die wir von egal wo in der klasse zugreifen können.

Linie4(def get_new_name(self):): In dieser Linie erstellen wir eine Funktion. Es ist genau wie wenn wir es nicht in einer klasse machen würden, aber wir haben halt das self argument (Was übrigens immer Pflicht ist, in einer Klasse).

Linie5(self.HisName = input("Neuer Name: ")): Hier machen wir einen neuen Wert für unsere Variable. Unzwar der Wert, der eingegeben wird. Falls du nicht weißt was Input macht, dann Google es bitte (Kann das schwer erklären, es macht halt ein Textfeld wo was eingegeben wird).

Linie6(return self.HisName): Wenn du eine Funktion als Variable speicherst ("eineVariable = test_function()"), dann wird der Wert in dieser Variable gespeichert. Das liegt daran, dass eben return dort steht. Return gibt etwas zurück, dass sich die Variable speichern kann. Da bei uns jetzt self.HisName steht (Also der User Name) gibt die Function jetzt den Wert von self.HisName zurück.

Linie7(erk = erklarung()): Hier initialisieren wir nur die Klasse. Wir machen eine Variable, in der wir die Klasse dann speichern.

Linie8(print....): Wie es dir vermutlich bekannt ist, gibt Print etwas aus. In dem Fall Fragen wir einmal nach dem Wert von self.HisName (Also: erk.HisName) und danach triggern wir die new_name funktion (Dabei wird ja HisName überschrieben, getriggert haben wir mit: erk.get_new_name()). Und da get_new_name() auch gleichzeitig den neuen Namen zurückgibt sehen wir ihn auch direkt.

Anmerkung zu self:
Self ist beispielsweise auch wichtig wenn du von z.B. der __init__ auf get_new_name zugreifen willst. wenn du self.get_new_name() machst, dann geht es, wenn du das self weg lässt dann nicht.

Sehr viele Infos und das kann aufs erste auch wirklich kompliziert aussehen. Allerdings hab ich wirklich versucht die Basics der Basics zu erklären. Frag wenn du Fragen hast.

Woher ich das weiß:eigene Erfahrung

Die Variable self zeigt stets auf das aktuelle Objekt, welches die Methode / das Feld aufruft. Wenn du also z.B. diesen Code hast:

class Person:
  def __init__(self, name):
    self.name = name

  def say_name(self):
    print("My name is", self.name)

max = Person("Max")
max.say_name()

dann würde intern das erzeugte Objekt max an die Stelle von self gesetzt werden.

Aus

max.say_name()

wird im Grunde:

say_name(max)

In einer Klasse kann man Variablen erstellen, die dann je nach Instanz unterschiedliche Werte haben. Mit dem self sagst du Python, dass du eben diese Variablen aus der entsprechenden Instanz einer Klasse haben willst, und nicht andere, globale Variablen.

Z.B. wenn "Car" eine Klasse ist.

auto_a = Car(marke="BMW")

auto_b = Car(marke="Audi")

Dann kannst du in der Klasse dann self.marke machen und bekommst dann bei der Instanz auto_a eben BMW und bei auto_b Audi...

Stark vereinfacht...

Schau dir für mehr diese tolle seite an: https://pythonbuch.com/objekte.html