2010-07-24 9 views
40

Ich möchte wissen, warum Python nicht vollständig objektorientiert ist. Beispielsweise werden private, öffentliche und geschützte Zugriffsebenenmodifikatoren nicht unterstützt.Warum ist Python nicht vollständig objektorientiert?

Was sind die Vor- und Nachteile? Mit diesen Ausdrücken eignet sich Python für welche Anwendungen (Desktop, Scientific, Web oder andere)?

+29

Sind das Hausaufgaben? – extraneon

+6

Python eignet sich für fast alles, das nicht auf hartes Zahlen-Knirschen angewiesen ist, aber selbst dann können Sie diese Teile in C schreiben. Die Kapselung ist in einer dynamisch typisierten Sprache nicht so nützlich. Es unterstützt nur den Compiler, sogar in Java kann (und muss) es manchmal durch Reflektion umgangen werden. Encapsulation, IMHO, fügt keine Sicherheit hinzu, es gibt nur das Gefühl, dass mehr Sicherheit vorhanden ist. –

+1

@extraneon: Nein, nur um zu wissen. @Wetzel: Ich stimme Ihnen zu "Encapsulation ist nicht so nützlich in einer dynamisch typisierten Sprache". –

Antwort

73

Python unterstützt keine starke Kapselung, die nur eine von vielen Funktionen im Zusammenhang mit dem Begriff "objektorientiert" ist.

Die Antwort ist einfach Philosophie. Guido mag es nicht, Dinge zu verstecken, und viele in der Python-Gemeinde stimmen ihm zu.

+8

+1, die richtige Antwort. Allerdings würde ich sagen: Python erzwingt nicht (Informationsverbergung/Kapselung) *. obj._field ist insofern "privat", als idiomatischer Python-Code nur dann auf ihn zugreifen kann, wenn es nötig ist (dir-Funktion, Reflektion, Serialisierung, um die Einschränkung des Legacy-Codes herumhacken zu müssen, die nicht geändert werden kann). Und Python ist mehr OO als z.B. Java oder C++ oder C#, da es keine Primitive gibt. – delnan

+0

@ Delnan: Du hast Recht; Python erzwingt kein Ausblenden/Einkapseln. Es unterstützt auch * Verbergen/Einkapseln nicht mehr als C. Tatsächlich unterstützt C ohne Nachdenken besser als Python! :-) –

+6

Just FYI: C# 's Primitive sind tatsächlich von System.ValueType abgeleitet, die von System.Object abgeleitet ist. Tatsächlich ist C# die einzige echte OO-Sprache, die ich kenne, da alles ein Objekt ist. – Xenoprimate

1

Ich denke, Python ist entworfen, um ein Hybrid zu sein. Sie können in objektorientierte oder funktionale Stile schreiben.

Die Kennzeichen der Objektorientierung sind Abstraktion, Kapselung, Vererbung und Polymorphie. Welche davon fehlen in Python?

Objektorientierung ist ein Kontinuum. Wir können sagen, dass Smalltalk das reinste des Reinen ist und alle anderen an verschiedenen Stellen auf der Skala stehen.

Niemand kann sagen, was der Wert von 100% rein ist. Es ist möglich, sehr guten objektorientierten Code in Sprachen zu schreiben, die nicht Smalltalk, Python enthalten.

Python ist nützlich in all diesen Bereichen: wissenschaftliche (NumPy), Web (Django) und Desktop.

3

Ich glaube, Python ist eher eine sehr praktische, pragmatische Sprache.

Konzepte, die dem Entwickler einen Mehrwert bieten, werden ohne allzu große Rücksicht auf theologische Konzepte wie "richtiges OO-Design" und so weiter verwendet. Es ist eine Sprache für Leute, die echte Arbeit haben.

Ich denke, Python eignet sich für alle Arten von Umgebungen, obwohl Desktop ein wenig schwierig ist, weil ein einziges Framework fehlt. Für alle Anwendungen ist es praktisch, ein Framework zu verwenden, wie NumPy für Computational Zeug, Twisted oder Django für Web-Zeug, und WxWidgets oder andere für Desktop-Zeug.

+1

Es gibt wirklich eine Menge Software für GNOME, die in Python geschrieben ist, ich habe selbst 11k Zeilen geschrieben, der Code ist einfach unglaublich lesbar und wartbar, die Entwicklung ist auch sehr schnell und es gibt Bindungen für fast alles. Aber ich muss zugeben, dass GTK manchmal sehr umständlich ist. –

+0

PyQT ist der Weg zu gehen! PySlide by nokia ist sogar noch viel besser.QT ist dank der LGPL jetzt auch für den Geschäftsverkehr geeignet Dank Nokia! –

+0

Das Einfügen von Feldern in Objekte ist _all_ aber pragmatisch, es macht Refactoring zu einem Albtraum. – Borsunho

38

Guido sagte einmal, dass "wir hier alle Erwachsenen zustimmen". Hier ist die längere Erklärung von vor langer Zeit: http://mail.python.org/pipermail/tutor/2003-October/025932.html

Es gibt eine Vereinbarung, die meine privaten Elemente unterstreicht und Sie sollten sie nicht verwenden. Es sei denn, Sie wissen, was Sie tun und Sie wirklich wollen.

Der Link auch eine andere Art und Weise erwähnt es bei Perl zu setzen:

„ein Perl-Modul würde es vorziehen, dass Sie aus seinem Wohnzimmer blieb
, weil Sie nicht eingeladen wurden, nicht weil es eine Schrotflinte hat. "

+11

+1 für das Zitat, das mag ich. – Davy8

+0

Liebe die Zitate. Ich glaube, dass private Instanzvariablen mehr sind als nur dafür, Programmierer davon abzuhalten, * in dein Wohnzimmer zu kommen *. In einigen häufigen Fällen (insbesondere in Setter-Methoden) möchten Sie, dass Ihr Objekt einige Daten ändert oder formatiert, bevor sie intern vom Objekt gespeichert werden, aus welchen Gründen auch immer. In diesem Fall können Sie nicht erwarten, dass ein anderer Programmierer weiß, wie diese Variable gespeichert oder auf sie zugegriffen werden soll. All diese Logik kann innerhalb der Getter- und Setter-Methoden eingekapselt werden. Und die exponierten Ivars sind chaotisch/verwirrend/irreführend. Das ist so ziemlich mein einziges Argument für die Privatsphäre. –

2

Was genau ist vollständig objektorientiert?Alan Kay sagte: "Eigentlich habe ich den Begriff" objektorientiert "erfunden, und ich kann Ihnen sagen, dass ich C++ nicht im Sinn hatte." Zugegebenermaßen hatte er wahrscheinlich auch keinen Python im Kopf, aber es ist erwähnenswert, dass Smalltalk auch Klassen durch Konvention, kein Mandat schützt.

-4

Eine Sprache wird zu Objective Oriented gesagt, wenn sie keine primitiven Datentypen hat. Jeder Datentyp, den wir konstruieren müssen.

Verwandte Themen