Ben_2003 hat geschrieben: Donnerstag 29. Mai 2025, 14:07
Wollte dennoch wissen, wie es mit der Vererbung von Klassen funktioniert, wie es z.B. bei C++ der Fall ist.
Die Vererbung läuft so, dass Python den gewünschten Namen zuerst in der abgeleiteten Klasse sucht und anschließend die Vererbungshierarchie nach oben läuft. Den ersten Treffer nimmt Python und gibt dessen Wert zurück bzw. ruft ihn auf. Je nachdem ob man Klammern dahinter gesetzt hat oder nicht.
Letzteres mag etwas banal klingen, aber es ist tatsächlich so, dass der Zugriff auf ein Attribut technisch genau so abläuft wie der Zugriff auf eine Methode. Denn im Falle einer Methode ist die Rückgabe des Attributs ein Funktionsobjekt. Da könnte anstelle der Funktion aber genau so der Integer 123 stehen.
Gemäß des Duck-Typing-Prinzips weiß Python erst durch den (Versuch eines) Aufruf(s), ob es sich tatsächlich um ein "Callable" handelt und würde ggf. einen Fehler werfen. Daher geben nicht vorhandene Methoden auch einen AttributeError und keinen MethodError oder ähnliches zurück.
Code: Alles auswählen
>>> class Foo:
... def spam(self):
... return "spam"
...
>>> foo = Foo()
>>> foo.spam
<bound method Foo.spam of <__main__.Foo object at 0x00000191CB59C590>>
>>> foo.spam.__func__
<function Foo.spam at 0x00000191CB5275E0>
Das Method-Objekt hatte ich jetzt übersprungen. Intern wird das aber als Funktion realisiert, die eben als erstes Argument (self) eine Instanz der Klasse mitbekommt.
Das alles wird hier noch sehr viel ausführlicher erklärt:
https://docs.python.org/3/tutorial/classes.html
Übrigens auch recht leicht auf Deutsch zu bekommen. Ich nutze dafür die in Chrome eingebaute Übersetzen-Funktion, die man - wenn es nicht schon von selbst angeboten wird - durch Rechtsklickt über das Kontextmenü erhält.