Funktionsweise von Klassen und self

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

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
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.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

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....
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
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.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

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
Antworten