Seite 1 von 1

Funktionsweise von Klassen und self

Verfasst: Sonntag 3. Januar 2016, 20:10
von dannyboy385
Hallo COmmunity. Mit der erwartung hier von einigen für blöd erklärt zu werden, wage ich mich jetzt mit meinem Verständnissproblem hier her.

Ich Habe ein Verständnissproblem mit Klassen insbesondere dem Parameter self.
Welche Vorteile bringen mir KLassen?
Wofür brauch ich den Parameter self und wie wird er verwendet.

wenn ich nun eine klasse definiere mit einer Funktion die nur slef auf dem Bildschirm ausgibt:

Code: Alles auswählen

class Klasse:
    def einefunktion(self):
        print (self)


while True:
    variable="iwas"
    Klasse.einefunktion(variable)

gibt die funktion einefunktion den wert welchen ich im Aufruf der Funktion in klammern übergebe aus also ist in diesem fall self=variable

Aber was bringt mir das und warum bekomme ich eine ganz andere Ausgabe wenn ich

Code: Alles auswählen

class Klasse:
    def einefunktion(self):
        print (self)


while True:
    x=Klasse()
    variable="iwas"
    x.einefunktion(variable)
Hier schmeist mir der interpreter einen Fehler.
Ich versteh das ganze überhauptnicht. Und eine plausible Erklärung habe ich weder in meinen Büchern noch im inet gefunden.
Ich hoffe mir kann das jemand etwas näher bringen.
Mfg Daniel

Re: Funktionsweise von Klassen und self

Verfasst: Sonntag 3. Januar 2016, 20:28
von BlackJack
@dannyboy385: Das ist keine Funktion sondern eine Methode und die sollte man auf dem Exemplar aufrufen was durch Aufruf der Klasse erstellt wird und nicht direkt auf der Klasse. Wenn man es auf dem Exemplar aufruft dann gibt es ein Argument weniger weil das `self` dann automatisch übergeben wird und zwar wird dort das Objekt übergeben auf dem die Methode aufgerufen wird.

Die Klasse macht so keinen Sinn, deshalb ist es vielleicht auch nicht so leicht für Dich den Sinn von Klassen zu verstehen. Mit Klassen kann man Daten und Funktionen die darauf operieren zu einem Objekt zusammenfassen. Du hast da aber keine Daten und zugehörige Funktionen, darum macht das Beispiel keinen Sinn.

In Büchern und Online findet man zumindest bessere Beispiele. Ich glaube nicht das es hier jetzt jemand besser erklären könnte als in den Büchern und Online-Quellen die Du schon gelesen hast, insbesondere wenn wir gar nicht wissen was Du schon gelesen und nicht verstanden hast.

Re: Funktionsweise von Klassen und self

Verfasst: Sonntag 3. Januar 2016, 20:51
von dannyboy385
Ich habe PYTHON3 das umfassende Handbuch gelesen und gerade auch vor mir liegen, aber mir platzt der Kopf.
Eine Klasse hat anscheinend ihren eigenen namensraum. mit irgendwas=Klasse() erzeuge ich eine neue Instanz der Klasse mit welcher ich auf die in der klasse definierten methoden zugreifen kann in dem ich irgendwas.Methode(Paramter) zugreifen kann und ihren rückgabewert weiterverarbeiten kann.
Bin ich soweit auf dem richtigen "drücker"?

self ist dann quasi der sagen wir name der instanz.
Also wenn ich eine Instanz=Klasse() habe und nun Instanz.Methode1(übergabeparameter) aufrufe, greift die Methode auf den Namensraum von Instanz der Klasse zu und in diesem Namensraum definierte Variablen und Funktionen zu????

ich bin echt am verzweifeln, dar mir der Sinn des ganzen nicht klar wird....

Re: Funktionsweise von Klassen und self

Verfasst: Sonntag 3. Januar 2016, 21:40
von pillmuncher
dannyboy385 hat geschrieben:ich bin echt am verzweifeln, dar mir der Sinn des ganzen nicht klar wird....
Schau dir mal das hier an. Vielleicht wird es dann klarer.

Re: Funktionsweise von Klassen und self

Verfasst: Sonntag 3. Januar 2016, 22:10
von BlackJack
@dannyboy385: Wenn Du eine Methode auf einem Exemplar (”Instanz”) aufrufst, dann muss die nicht zwingend einen Rückgabewert haben. Es gibt auch Methoden deren Aufgabe es ist den (inneren) Zustand des Objekts zu ändern, also die Daten die diesen Zustand beschreiben. Zum Beispiel bei einem Objekt das ein Fahrzeug modelliert könnte es eine Methode ``def accelerate(self, amount): …`` geben welche die Geschwindigkeit des Objekts ändert. Diese Geschwindigkeit könnte man beispielsweise als `speed`-Attribut modellieren.

Eine Methode greift nur explizit auf den Namensraum des Objekts zu, das heisst Du musst das über das `self`-Argument machen. Es gibt kein implizites ``this`` wie beispielsweise bei Java.

Re: Funktionsweise von Klassen und self

Verfasst: Montag 4. Januar 2016, 09:40
von kodela
Hallo Daniel,

ich habe zur Funktionsweise von Klassen und "self" mit dieser Seite der Uni Freiburg eine Erklärung gefunden, die mir sehr geholfen hat. Vielleicht hilft sie Dir ja auch. Diese Zusammenstellung ist zwar nicht mehr ganz "taufrisch", aber ich denke, dass sich wohl nichts Grundlegendes an dem geändert hat, was beschrieben wurde.

MfG, kodela