Seite 1 von 1

Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 01:24
von moe
Hallo Forum,

ich habe eine Frage bezüglich des Schlüsselwortes self. Ich habe ein kleines Python-Skript geschrieben, in dessen Konstruktor __init__ werden verschiedene Objekte von Klassen instanziiert. Auch werden dort mehrere Variablen deklariert. Ist es notwendig im Konstruktor vor allen Objekt- und Variablen-Namen ein self voranzustellen? Wie ich gesehen habe, ist das nicht immer notwendig. Die meisten Variablen benutze ich in verschiedenen Methoden der Klasse. Was ist hier "best practice"?

Gruß

moe

Re: Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 01:37
von sparrow
@moe: Selbst repräsntiert die aktuelle Instanz des Objektes. Alles, was du an self bindest wird ein Attribut dieser Instanz. Alle Attribute sollten in init definiert sein (auch wenn das technisch nicht unbedingt nötig ist, aber es macht das Verstehen deutlich einfacher). Alles was du in der __init__ initialisierst und nicht an self bindet ist anschließend nicht mehr verfügbar. Und daraus ergibt sich eigentlich schon, was dahin gehört: Alles das was ein Attribut werden soll - also in dem Objekt zur Verfügung stehen soll oder muss.

Re: Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 01:53
von grubenfox
Wenn die Variablen zu der Klasse gehören (und auch in anderen Methoden der Klasse, nachdem der Konstruktor abgearbeitet wurde, benutzt werden), dann mit self. Wenn sie nur innerhalb des Konstruktors solange der Konstruktor ausgeführt wird, gültig sein sollen, dann ohne.
Aber irgendwie klingt die Frage bzw. die Beschreibung etwas kaputt.
Oder geht es hier um Klassen-Variablen und Objekt-Variablen? Die ersten sind auch ohne self, aber auch gar nicht innerhalb des Konstruktors...

Re: Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 07:34
von snafu
Nochmal anders ausgedrückt:

- Zugriff außerhalb von __init__() benötigt: self verwenden
- Zugriff nur innerhalb von __init__() nötig: kein self verwenden

Re: Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 11:14
von nezzcarth
moe hat geschrieben: Samstag 28. Dezember 2024, 01:24 ich habe eine Frage bezüglich des Schlüsselwortes self.
'self' ist kein Schlüsselwort/reserviertes Wort. Der OOP Mechanismus von Python ist so konzipiert, dass Funktionen innerhalb von Klassen (Methoden) als erstes Argument eine Instanz des Objekts bekommen. D.h. das ist also gewissermaßen einfach nur eine Vorgabe für die Funktions-/Methodensignatur. Welchen Namen du für dieses Argument vergibst, ist egal. Es ist nur absolut unüblich, bei regulären Methoden irgendwas anderes als 'self' zu verwenden. Eine Ausnahme bilden z.B. Klassenmethoden, die mit '@classmethod' erzeugt werden. Hier ist das erste Argument die Klasse und entsprechend wird es statt 'self' 'cls' genannt. Eine weitere Ausnahme sind statische Methoden ('@staticmethod'), die kein Argument bekommen. Schlüsselwörter sind so etwas wie "class", also Wörter, für die die Programmiersprache sozusagen "Eigenbedarf" anmeldet, weil sie syntaktische Bedeutung haben und die du nicht selbst anderweitig verwenden darfst; das ist bei 'self' nicht der Fall.

Re: Schlüsselwort self in Konstruktor

Verfasst: Samstag 28. Dezember 2024, 21:16
von __blackjack__
@moe: Neben den technischen Details die schon genannt wurden vielleicht noch der Hinweis, dass eine Klasse zusammengehörende Daten und Funktionen als Attribute und Methoden zu einem Objekt zusammenfasst. Das sollte also nicht einfach eine Sammlung von Variablen sein, auf die Funktionen in Form von Methoden dann einfach so zugreifen als wenn man das von Modulebene in eine Klasse verschoben hätte um das ``global``-Schlüsselwort zu vermeiden und einfach nur durch `self` vor den ”Variablen” zu ersetzen.

Wo das ``self`` für Daten dazu gehört ergibt sich daraus welche Daten den Zustand des Objekts ergeben, und das weiss man normalerweise bevor man eine Klasse schreibt. Darum ist die Frage ein bisschen komisch.

Was stellt denn die Klasse dar?

Re: Schlüsselwort self in Konstruktor

Verfasst: Sonntag 29. Dezember 2024, 01:02
von moe
Hallo an alle,

erstmal vielen Dank für die vielen informativen Antworten. Ich experimentiere gerade etwas mit wxPython. Im Konstruktor initialisiere ich verschiedene Widgets davon. In mehreren Methoden nutze ich diese dann. Ist noch nichts Großes.
grubenfox hat geschrieben: Samstag 28. Dezember 2024, 01:53 Oder geht es hier um Klassen-Variablen und Objekt-Variablen? Die ersten sind auch ohne self, aber auch gar nicht innerhalb des Konstruktors...
Klassen-Variablen nutze ich keine. Dass diese außerhalb des Konstruktors sich befinden, habe ich aber schon gewusst. Die Widgets, die ich von wxPython nutze habe ich alle als Objektvariablen angelegt.
__blackjack__ hat geschrieben: Samstag 28. Dezember 2024, 21:16 Was stellt denn die Klasse dar?
Meine Klasse habe ich von wx.App abgeleitet und stellt eine grafische Oberfläche dar.