ruby vs python (is: Programmierung)
Ingo Lütkebohle
iluetkeb at gmail.com
Tue Nov 9 14:45:40 CET 2004
Hiya,
ich habe nicht die Absicht, in eine Sprachendiskussion einzusteigen,
dafür gibts bessere Orte. Aber ein bisschen was zum Konzept der
Objektorientierung und ein paar Richtigstellungen zu Python konnte ich
mir nicht verkneifen.
On Tue, 09 Nov 2004 11:56:25 +0100, Thorsten Roggendorf
<thorsten.roggendorf at uni-bielefeld.de> wrote:
> > wie misst man die objektorientiertheit einer sprache?
Gemeinhin versteht man unter Objektorientierung die Konzepte
Kapselung, Vererbung und Polymorphie. Kapselung bedeutet zum einen,
Variablen und Methoden zusammenzufassen (eben zu Objekten), zum
anderen aber auch, dass der Zugriff kontrolliert wird.
In Python gibt es schwache Kapselung -- wenn man will, kann man sie
durchbrechen. Nicht aus Versehen, aber es geht. In C++ kann man sie
deklarativ durchbrechen, in Java gar nicht. Python beruht sehr stark
auf dem Namensraumkonzept (ein Modul ist ein Namensraum, eine Klasse
auch), was eine Fortsetzung der Kapselung darstellt und die Grundlage
der Introspektion und Reflektion darstellt.
Bei Vererbung gibts Implementierungs- und Schnittstellenvererbung.
C++ und Python kennen strenggenommen nur Implementierungsvererbung,
über virtuelle Methoden kann man Schnittstellen abbilden, Java kennt
beides. C++ kann Mehrfachverberung, Python auch, Java nur bei
Schnittstellen.
Polymorphie ist eigentlich ziemlich einheitlich, Python ist immer
vollständig polymorph, in C++ ist der Standardfall keine Polymorphie,
man kann es aber aktivieren (virtual), in Java standardmässig
polymorph, kann man aber verhindern (final).
Das soll keine erschöpfende Liste sein, nur mal ein paar
Vergleichspunkte darstellen und hoffentlich klar machen, dass es nicht
"mehr objektorientiert" gibt sondern nur unterschiedliche Ausprägungen
grundlegender Konzepte. Dass Java z.B. Mehrfachvererbung nur bei
Schnittstellen zulässt ist sehr bewusst entscheiden worden.
> In Python benutzt man manchmal Objekt-Methoden und manchmal globale
> Funktionen. Der Standard for-Loop sieht z.B. so aus:
> for i in range():
> print array[i]
Nur dass "range" ein Typkonstruktor ist, keine Funktion ;-) Es wird
eine Liste erzeugt.
Prinzipiell ist es jedoch richtig, dass es in Python "globale
Funktionen" gibt, im allgemeinen operieren diese auf Zahlen und es
gibt ein paar häufige Abkürzungen. Es gibt auch ungebundene Methoden,
bei denen es sich aber nicht um "globale Funktionen" sondern um
Funktionsobjekte handelt, die in einem bestimmten Namensraum gebunden
sind.
Die Tatsache, das bestimmte Funktionsobjekte im eingebauten Namensraum
verfügbar sind, macht aus ihnen noch keine Funktionen im 'C'-Sinne und
ich kann zwar nachvollziehen, wieso manche Leute das als "nicht so
objektorientiert" ansehen, halte das aber für einen Fehlschluss.
> Bei einer schwach typisierten Sprache (wie Ruby und Python) ist
> das ein entscheidender Vorteil.
Das ist falsch. Python ist stark typisiert, aber dynamisch, d.h. die
Typprüfung wird erst zur Laufzeit ausgeführt und Typen müssen nicht
deklariert werden.
Ingo
More information about the Linux
mailing list