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.

@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.