Grund für ungewöhnliche OOP in Python?

8

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 :

übergeben wird %Vor%

Dasselbe mit len :

%Vor%

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?

    
deamon 25.02.2011, 20:02
quelle

4 Antworten

13

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

    
FogleBird 25.02.2011, 20:22
quelle
4

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.

    
S.Lott 25.02.2011 20:12
quelle
0

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.

    
9000 25.02.2011 20:17
quelle
0

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:

%Vor%     
Cheezmeister 25.02.2011 20:22
quelle

Tags und Links