Ich lerne weiter Python. Bin jetzt bei Klassen.
Es scheint so zu sein, dass alle Attribute immer public sind, also erst mal ähnlich wie ein struct in C++.
Die fehlende Typprüfung wirkt hier auf mich besonders irritierend, weil ich einfach eine Funktion, die eine Klasseninstanz als Parameter nimmt, ohne Typangabe definieren kann, wenn ich dann im Programm irgend was anderes in die Funktion reinstecke, gibt's einen Fehler zur Laufzeit.

Aber wie ich Python kenne, kann man das sicher zus. einbauen.

Jetzt Klassenmethoden: Gut, nun weiß ich, dass da immer self stehen muss, das war mir beim Lesen von Python Code immer völlig unverständlich, was das ewige self soll.
Widerspricht aber irgendwie dem Geiste von Python, dass alles immer möglichst einfach sein soll - wenn da sowieso immer self steht, könnte man es ja auch weglassen.
Logisch wäre es, wenn es sowas wie statische Methoden gibt, die bräuchte kdann kein Self (weil dann keine Instanz der Klasse nötig wäre), vielleicht kommt das ja noch.

Und tatsächlich:
class MeinRechner:
@staticmethod
def addiere(a, b):
# Keine Referenz auf self oder cls
return a + b

# Aufruf ohne Instanziierung
ergebnis = MeinRechner.addiere(5, 3)
print(ergebnis) # Ausgabe: 8

Nur - wenn da kein self steht, muss es ja eine statische Methode sein, warum muss man dann @staticmethod dazuschreiben? Ist doch dann auch redundant.

Jetzt die "magic methods", die in doppelte Unterstriche eingerahmt sind: Hier merke ich mir mal, dass man damit Konstruktoren realisiert (__init__), operatoren überladen kann (was in Java ja nicht geht, aber etwa in C++, hat mich in Java immer gestört) und sonstiges Standardverhalten implementieren kann (Umwandlung in string etwa).

@andreasgoebel Es gibt mehrere Gründe für das self:

1. Eine Funktion ist eine Methode. Sie erhält nur als ersten Parameter eine Referenz auf ein Objekt.

2. Python verfolgt nicht nur das Mantra beautiful is better than ugly, sondern auch explicit is better than implicit. In Java ist this ein Keyword um implizit auf die Instanz der Klasse zuzugreifen. In Python ist self gar kein keyword.

@andreasgoebel

In meiner miniworlds-Engine macht das einen Unterschied, dort kann man z.B. schreiben:

@player.register
def on_key_down_w(self):
self.y = self.y - 1

Dort wird die Funktion dynamisch an ein Objekt gebunden, ohne den Umweg über eine Klasse.

@andreasgoebel
Es gibt zusätzlich zu @staticmethod auch @classmethod, die man üblicherweise verwendet, wenn man factories baut:

class MeinRechner
@classmethod
def from_data(cls, data):
return cls(data.name, data.ip)

(Man könnte statt return cls auch return MeinRechner schreiben - Das führt aber in einigen Situationen zu Problemen mit Vererbung)