Hey liebe Community,
ich habe eine Frage, unzwar verstehe ich das immer noch nicht ganz mit dem objektorientierten Programmieren.
Was genau ist eine Instanz, warum haben wir sowas, wann setzen wir eine Instanz ein, wann kommt es als Argument und wann in die Funktion an die Methode drangehangen??
Und die gleichen Fragen habe ich auch bei self.
Objektorientiertes Programmieren
- __blackjack__
- User
- Beiträge: 14067
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Enis67: Eine Klasse ist eine Art Bauplan für eine Instanz, also zum Beispiel das klassische `Auto`-Beispiel da ist die Klasse der Bauplan für ein Auto. Und eine Instanz (eigentlich eine falsche Übersetzung von „instance“) ist dann ein konkretes, nach diesem Bauplan erstelltes Objekt.
So etwas haben wir um Daten und Verhalten zu einem Objekt/Wert zusammenfassen zu können. Weil es Code und Daten strukturiert und damit Programme einfacher verständlich macht.
Die Frage nach den Argumenten verstehe ich nicht. Man übergibt an Funktionen und Argumente alles was die brauchen und was keine Konstante ist. Das hat nicht speziell etwas mit objektorientierter Programmierung (OOP) zu tun, das ist auch bei prozeduraler und funktionaler Programmierung der Normalfall.
`self` ist der konventionelle Name für das erste Argument von Methoden und das erste Argument von Methoden ist das Objekt (die Instanz) auf dem die Methode aufgerufen wurde, das heisst das ist das erste Argument von jeder Methode. Und inhaltlich ist eine Methode im Grunde nur dann eine Methode, wenn dieses `self` innerhalb der Methode auch verwendet wird. Denn wenn das nicht verwendet wird, dann könnte man die Methode ja auch ausserhalb der Klasse einfach als Funktion definieren. Falls `self` also nicht verwendet wird, muss man einen guten Grund haben warum da eine Funktion in der Klasse steckt. Solche Gründe kann es geben, das sollte man sich aber immer klar machen. Und diese ”Methode” auch als `staticmethod()` definieren, damit auch der Leser weiss, dass das Absicht ist, und kein Fehler oder unvollständiger Code.
Praktisch gesehen kann man in der Regel erst einmal prozedural/funktional anfangen. Irgendwann kommt man dann an den Punkt, wo man sieht, dass bestimmte Einzelwerte eigentlich zusammengehören, und man für diesen Verbund einen Namen finden kann. Dann kann man diese Werte zu einem Datenobjekt zusammenfassen, über das man die Werte dann gemeinsam ansprechen und in der Gegend herum reichen kann. Methoden die auf diesen Daten operieren/zu diesen Daten gehören ergeben sich dann oft ganz natürlich, und man kann den entsprechenden Code aus den bisherigen Funktionen verschieben.
Wenn man darin ein bisschen Übung hat, bekommt man ein Gefühl dafür was man von Anfang an sinnvoll in Klassen organisieren kann.
So etwas haben wir um Daten und Verhalten zu einem Objekt/Wert zusammenfassen zu können. Weil es Code und Daten strukturiert und damit Programme einfacher verständlich macht.
Die Frage nach den Argumenten verstehe ich nicht. Man übergibt an Funktionen und Argumente alles was die brauchen und was keine Konstante ist. Das hat nicht speziell etwas mit objektorientierter Programmierung (OOP) zu tun, das ist auch bei prozeduraler und funktionaler Programmierung der Normalfall.
`self` ist der konventionelle Name für das erste Argument von Methoden und das erste Argument von Methoden ist das Objekt (die Instanz) auf dem die Methode aufgerufen wurde, das heisst das ist das erste Argument von jeder Methode. Und inhaltlich ist eine Methode im Grunde nur dann eine Methode, wenn dieses `self` innerhalb der Methode auch verwendet wird. Denn wenn das nicht verwendet wird, dann könnte man die Methode ja auch ausserhalb der Klasse einfach als Funktion definieren. Falls `self` also nicht verwendet wird, muss man einen guten Grund haben warum da eine Funktion in der Klasse steckt. Solche Gründe kann es geben, das sollte man sich aber immer klar machen. Und diese ”Methode” auch als `staticmethod()` definieren, damit auch der Leser weiss, dass das Absicht ist, und kein Fehler oder unvollständiger Code.
Praktisch gesehen kann man in der Regel erst einmal prozedural/funktional anfangen. Irgendwann kommt man dann an den Punkt, wo man sieht, dass bestimmte Einzelwerte eigentlich zusammengehören, und man für diesen Verbund einen Namen finden kann. Dann kann man diese Werte zu einem Datenobjekt zusammenfassen, über das man die Werte dann gemeinsam ansprechen und in der Gegend herum reichen kann. Methoden die auf diesen Daten operieren/zu diesen Daten gehören ergeben sich dann oft ganz natürlich, und man kann den entsprechenden Code aus den bisherigen Funktionen verschieben.
Wenn man darin ein bisschen Übung hat, bekommt man ein Gefühl dafür was man von Anfang an sinnvoll in Klassen organisieren kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hast du auch nur ein einziges Tutorial oder sowas zu dem Thema durchgearbeitet? Das ist ja nicht so, als ob's dazu nicht eine Menge Erklaerungen gaebe. Und fuer Code im uebrigen bitte immer die Code-Tags benutzen, das ist der </>-Knopf im vollstaendigen Editor.
self bezeichnet die Instanz. Mit self.variable greift man auf eine Variable der Instanz zu. Mit self.variable = ... legt man eine an, oder weist ihr einen neuen Wert zu. Und wenn man nicht self. davor schreibt, dann ist variable eine lokale Variable. Auch die will man ja haben. Woher also soll Python sonst wissen, ob etwas lokal oder auf der Instanz gehalten sein soll?
self bezeichnet die Instanz. Mit self.variable greift man auf eine Variable der Instanz zu. Mit self.variable = ... legt man eine an, oder weist ihr einen neuen Wert zu. Und wenn man nicht self. davor schreibt, dann ist variable eine lokale Variable. Auch die will man ja haben. Woher also soll Python sonst wissen, ob etwas lokal oder auf der Instanz gehalten sein soll?
- __blackjack__
- User
- Beiträge: 14067
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Enis67: `self` ist das `Cube`-Objekt das initialisiert werden soll und wenn man auf dem ein Attribut anlegen will, muss man das halt auch sagen das auf *dem* Objekt ein Attribut angelegt werden soll. Ohne würde da nur ``length = length`` stehen, was denkst Du denn was *das* dann bewirken sollte? Das kann man auch schreiben, das hat aber keinen Effekt wenn man dem Namen `length` den Wert zuweist der vorher auch schon an den Namen `length` gebunden war.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari