Anstatt gemeinsame OOP zu verwenden, wie Java und C # mit ihrer Basisklasse Object
oder object
, verwendet Python spezielle Methoden für das grundlegende Verhalten von Objekten. Python verwendet __str__
, das verwendet wird, wenn das Objekt an print
:
Dasselbe mit len
:
Was ich erwarten würde, ist etwa so:
%Vor%Was ist der Grund dafür, spezielle Methoden indirekt zu verwenden, statt die üblichen Methoden direkt aufzurufen?
Der Grund dafür ist in der Python-Dokumentation hier gut erklärt:
Der Hauptgrund ist Geschichte. Funktionen wurden für diese Operationen verwendet, die waren generisch für eine Gruppe von Typen und die sollen sogar funktionieren für Objekte, für die keine Methoden verfügbar waren alle (z. B. Tupel). Es ist auch bequem, um eine Funktion zu haben, die kann leicht auf ein amorphes aufgetragen werden Sammlung von Objekten, wenn Sie das verwenden Funktionsmerkmale von Python (map (), apply () ua).
Tatsächlich implementieren len (), max (), min () als eine eingebaute Funktion ist eigentlich weniger Code als das Implementieren sie als Methoden für jeden Typ. Man kann munkeln über einzelne Fälle aber es ist ein Teil von Python, und es ist auch spät, um so grundlegende Veränderungen vorzunehmen jetzt. Die Funktionen müssen bleiben Vermeiden Sie massiven Code-Bruch.
(Dies wurde in den Kommentaren beantwortet, aber muss als eine echte Antwort für zukünftige Leser gezeigt werden.)
Dies sind keine Haken.
Sie sind nur Methoden mit speziellen Namen.
Die Konvention für spezielle Methodennamen in Python lautet __name__
.
Die eingebauten len-, iter-, str-, repr- (und anderen) Funktionen verwenden gewöhnliche Methoden mit Namen, die einer speziellen Konvention folgen, so dass wir alle sicher sein können, dass wir die speziellen Methoden richtig implementiert haben.
Die speziellen Methoden haben merkwürdig aussehende Namen, so dass wir beliebige Namen ohne Angst vor einer Kollision verwenden können.
obj.len () wäre viel intuitiver zu implementieren und zu verwenden.
Ihnen vielleicht. Für andere kann es völlig verblüffend sein.
Python hat beide Methodenschreibweise und Funktionsschreibweise für viele allgemeine Funktionen.
Und die Funktionsnotation ist bevorzugt.
Es ist immer noch OO-Programmierung. Nur die Schreibweise wurde geändert.
Hooks ermöglichen das Verhalten von Standard Funktionen neu zu definieren. Ziehen Sie in Betracht, __add__()
zu überschreiben und den standardmäßigen Infix-Operator +
zu verwenden, anstatt eine benutzerdefinierte add()
hinzuzufügen und verschachtelte Aufrufe zu verwenden.
Darüber hinaus können Sie, wenn Sie __iter__()
definieren, Ihr Objekt in einer for ... in
-Schleife verwenden. Vergleichen Sie es mit dem Steuern einer Schleife und Fortschreiten der Iteration von Hand. Überlegen Sie, __call__()
zu überschreiben und Ihre Instanzen in Funktionen zu verwandeln, so gut wie jede andere Funktion. Das gibt enorme Flexibilität.
Wenn Sie möchten, macht Java dasselbe mit .toString()
, das implizit funktioniert, wenn Sie das Objekt drucken oder mit einer Zeichenfolge verketten.
Nicht ein Pythonista, also mag das weit weg sein, aber wenn ich Ihre Frage verstehe, ist mein Eindruck, dass es eher um Stil und Idiom als um Verhalten geht. Java und in geringerem Maße C # sind sehr ausführliche, kanonische und orthogonale Sprachen. Alles ist ein Objekt (oder für C #, verhält sich wie eins - IIRC int.toString()
ist gültig), und alles, was Ihr Programm tut, sollte explizit ausgedrückt werden.
Python ist knapper und schätzt Bequemlichkeit bei gelegentlichen Kosten der Klarheit. Das sehen Sie auch in C ++ mit impliziten Konvertierungen und operativer Überladung. Betrachten Sie einfach das C ++ - Analog zu Ihren toString()
-Beispielen: