this und self
In Java schreibst du this.feld. In Python self.feld. Beide bedeuten dasselbe:
"Greif auf das Feld dieser konkreten Instanz zu."
Wenn du innerhalb einer Methode this.kmh schreibst, meinst du das kmh-Feld des Objekts, auf dem die Methode gerade aufgerufen wurde.
auto1.beschleunigen(); // this.kmh ist auto1.kmh
auto2.beschleunigen(); // this.kmh ist auto2.kmh
Zugriffsrechte: public vs private
In Java steuern Sichtbarkeitsmodifier den Zugriff auf Felder, Methoden und Konstruktoren, also Lesen, Schreiben und Aufrufen:
- public: jeder darf zugreifen
- private: nur die Klasse selbst
- protected: Klasse + Subklassen + selbes Package
- kein Modifier (package-private): alle Klassen im selben Package
Konvention: Felder sind oft private, Zugriff über Getter und Setter mit Validierung:
private int tank;
public int getTank() { return this.tank; }
public void setTank(int t) {
if (t < 0) throw new IllegalArgumentException("tank darf nicht negativ sein");
this.tank = Math.min(t, 50); // Obergrenze 50 durchsetzen
}
Ein Setter ohne Validierung (this.tank = t;) demonstriert keine echte Kapselung, die Regel "tank darf nicht negativ werden" muss durchgesetzt werden.
In Python gibt's keinen erzwungenen private-Modifier wie in Java:
_tank (ein Unterstrich) ist Konvention für "intern, nicht öffentlich".
__tank (zwei Unterstriche) löst Name Mangling aus (_Klassenname__tank), ist aber kein echter Zugriffsschutz.
Encapsulation (Kapselung)
Das ist die Hauptidee von OOP:
Verstecke den State (Felder), erlaube Änderungen nur über Methoden.
So kannst du Regeln durchsetzen. Z.B.: "tank darf nicht negativ werden":
public void beschleunigen() {
if (this.tank >= 5) { // Regel in der Methode durchsetzen
this.kmh += 20;
this.tank -= 5;
}
}
Würde jemand direkt auto1.tank = -50 setzen, wäre der State kaputt. Mit private + Getter/Setter kannst du das verhindern.