Ich möchte OOP lernen. Ich kenne Python und ich weiß sehr wenig über OOP.
Aber als ich in Foren nach "OOP lernen" suchte, sah ich einen Mann, der sagte: "Python ist so neu, dass man OOP auf Python nicht lernen kann. Man sollte Java lernen und dann OOP auf Java verstehen."
Ist es wahr? Gibt es einen Unterschied beim Verständnis von OOP in verschiedenen Programmiersprachen? Möchten Sie es auf Java, C #, C ++, Perl oder Python lernen?
java
object-oriented
python
user2783998
quelle
quelle
Antworten:
Ein Objekt als theoretisches Konstrukt ist sehr einfach: Es ist eine Struktur, die Daten, Funktionen oder beides speichert. Die Idee ist, dass diese Strukturen ein Gefühl von "Selbst" haben, das in den meisten Sprachen außerhalb von Python impliziert ist. Dies wird als "Deskriptor" bezeichnet und gibt dem Objekt einen Selbstreferenzpunkt, der Daten (Variablen oder Felder) und Funktionen (normalerweise als Methoden bezeichnet) an das betreffende Objekt bindet. Die Idee ist, dass Sie speziell eine Variable oder Methode verwenden, die zu dieser bestimmten Instanz gehört (zugewiesener Speicherblock normalerweise darunter), anstatt zu einem größeren, allgemeineren Konstrukt.
Objektsysteme variieren in Bezug auf zwei große Kategorien: Vererbung und Zugriff.
Einige, wie Java oder C ++, haben Klassen deklariert, die als "Blaupausen" für Objekte dienen, die dann zugewiesen werden. Diese Klassen und ihre Objekte können nach der Instanziierung nicht mehr strukturell geändert werden. Sie können ihren Inhalt in dem Sinne überschreiben, dass sich Variablen ändern können, ihre Struktur jedoch statisch ist. Sie können beispielsweise keine neuen Methoden zu HashMap in Java hinzufügen. Sie können die Schnittstelle erweitern (im Grunde teilweise implementierte Klassen, die als Verträge dienen) oder eine Unterklasse erstellen, um die zusätzlichen Methoden oder Variablen zusammen mit allen ursprünglichen Variablen und Methoden der jeweiligen Klasse abzurufen.
Andere klassenbasierte Sprachen, von denen Ruby am häufigsten zitiert wird, ermöglichen es Ihnen, eine vorhandene Klasse einfach zu öffnen und Methoden nach Belieben hinzuzufügen. Dies ist ein Streitpunkt und wird von vielen als sehr, sehr gefährlich angesehen.
Javascript ist noch lockerer. Objekte sind nichts anderes als eine Sammlung von Slots für Variablen oder Funktionen. Sie können geändert oder überschrieben werden, wenn der Programmierer dies für erforderlich hält. Sie können sogar willkürlich als "Prototypen" für andere Objekte geklont werden, wodurch alle ihre Fähigkeiten weitergegeben werden.
Die Zugangskontrolle ist der andere große Unterschied zwischen den verschiedenen Sprachen.
Einige Sprachen wie Java haben sehr streng erzwungene Zugriffsmodifikatoren wie "privat" und "geschützt", die genau definieren, welche Klassen und Unterklassen eine bestimmte Variable oder Methode verwenden können.
Andere, wie z. B. Python, sind weniger formal und verwenden die Konvention eines Unterstrichs vor dem Methoden- oder Variablennamen, um anzuzeigen, dass es privat ist.
Letztendlich ist Python eine absolut legitime Sprache, um objektorientiert zu programmieren. Sie setzt sie einfach nicht so streng durch wie einige der anderen.
quelle
private
für Java und underscore (__
) für Python haben. Ich denke, die Abstraktionsebene von Python könnte es für Anfänger etwas schwieriger machen, aber definitiv nicht unmöglich. Java formuliert es für den Programmierer, wodurch einige Konzepte möglicherweise leichter haften bleiben.Das Erlernen von OOP- Prinzipien ist überhaupt nicht sprachspezifisch. Wenn Sie also mit "OOP lernen" meinen, "lernen, was die Terminologie bedeutet, was OOP ist und warum ich es möglicherweise verwenden möchte", spielt die Sprache keine Rolle.
Wenn Sie "lernen, wie man mit OOP entwickelt" meinen, dann gehen verschiedene Sprachen unterschiedlich damit um, aber alle teilen die gleichen Prinzipien. Wenn Sie so etwas wie ich sind, lernen Sie es am besten, indem Sie es einfach tun. Wählen Sie eine objektorientierte Sprache mit einem guten Tutorial oder Buch, das die objektorientierten Aspekte abdeckt und darüber verfügt. Wenn Sie die Prinzipien des objektorientierten Designs nicht kennen, können Sie sie in jeder anderen OO-Sprache verwenden.
Das macht mir nur den Kopf weh. So viel Falsches in einem Satz.
Python stammt aus dem Jahr 1989.
http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html
Java bis 1995.
http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html
Sie können Ihre eigenen Schlussfolgerungen über die Gültigkeit dieses Ratschlags ziehen ...
quelle
Ich denke, die Person, die Sie zitieren, zeigte einfach Sprachchauvinismus.
In Wirklichkeit gibt es einen Unterschied zwischen OOP- Konzepten und der Implementierung von OOP. Poetisch ist dies am besten zu verstehen, wenn Sie einige der Konzepte von OOP besser verstehen.
Viele Programmierer fühlen sich mit nur wenigen ähnlichen Sprachen wohl, sodass sie ihre Fähigkeiten nicht erweitern müssen oder eine Zeit lang nicht in der Lage sind, fähig zu sein.
Die Frage ist also, ob Python Ihnen die Konzepte von OOP beibringt .
Ich werde sagen, dass Sie dies können, vorausgesetzt, Sie haben eine angemessene Lernunterstützung, die Sie dazu bringt, Dinge auszuprobieren, die Sie normalerweise beim selbstgesteuerten Lernen nicht erforschen würden. Ein Buch oder ein Mentor wäre am besten. Mark Lutz schreibt sehr ausführliche, sehr detaillierte und sehr gute Bücher über Python, und ich würde seine Bücher empfehlen, weil sie Sie dazu bringen werden, mehr zu tun und zu lernen.
Was Sie beachten müssen, ist, dass Pythons Weg weder der einzige noch der einzig richtige Weg ist. Je mehr Programmierparadigmen Sie beherrschen, desto besser werden Sie zum Programmierer. Die Art und Weise, wie Python OOP macht, ist nicht genau so, wie es C ++ oder Java macht, aber die Konzepte lassen sich gut übertragen.
quelle
Ja, OOP-Implementierungen sind sehr unterschiedlich. Die Theorie und die Prinzipien sind zwar die gleichen, aber so viele Leute betrachten nur "echtes OOP" als das, was Java und C ++ tun, dass Sie viele Referenzen erhalten, die "sprachunabhängig" sein sollen, aber tatsächlich klassenbasierte, statisch typisierte Sprachen annehmen .
Das bedeutet nicht, dass diese Referenzen schlecht oder sogar begrenzt sind. Zum Beispiel ist das wegweisende Buch "Design of Patterns: Elemente wiederverwendbarer objektorientierter Software" der "Gang of Four" (GoF) ein Paradebeispiel für eine großartige Arbeit, die "OOP" sagt, wenn es wirklich "statische klassenbasierte OOP" bedeutet.
Meiner Meinung nach können Sie also viel OOP in Python, Javascript, C und vielen anderen Sprachen lernen. Aber einige Leute (vielleicht ein zukünftiger Arbeitgeber), die nach "OOP-Erfahrung" fragen, meinen Java / C ++ / C #. Es wäre also ratsam, auch diese andere Ansicht zu überprüfen.
(und das sind nicht die einzigen zwei Arten von OOP ...)
quelle
Objektorientierte Programmierung ist eine Idee zur Strukturierung der Programmiersprache, um eine geringe Kopplung, das Verbergen von Informationen (auch als Kapselung bezeichnet), das Bündeln von Daten und Methoden, die diese Daten zusammen verarbeiten, und die Wiederverwendung von Code zu fördern. Viele Sprachen setzen diese Ideen um, sodass es zwischen den Sprachen Unterschiede gibt, wie sie sich der Objektorientierung nähern. Beispielsweise erlaubt Java einer Klasse nur, eine Klasse zu erweitern. Mit Python und C ++ können Sie jedoch eine beliebige Anzahl von Klassen erweitern. Java hat bestimmte Gründe für seine Einschränkungen. Einschränkungen, die dazu gedacht sind, Dinge aus C ++ zu korrigieren, aber auch, weil Smalltalk nur eine einzige Basisklasse unterstützt.
OO-Sprachen können in zwei Familien eingeteilt werden. Die Smalltalk-Familie (oder klassenbasierte OOP) von Sprachen umfasst C ++, Java, Smalltalk, Ruby, C # und Python, um nur einige zu nennen (es gibt Tonnen in dieser Familie). Dies ist eine Mischung aus statisch und dynamisch typisierten Sprachen, und obwohl sie sich in einigen Konzepten geringfügig unterscheiden, sind sie sich in ihrer Meinung zu OOP sehr ähnlich. Damit meine ich, wie sie sich der Kopplung, Kapselung, Bindung von Daten und Methoden sowie der Wiederverwendung von Code nähern und welche Tools sie Ihnen dafür zur Verfügung stellen. Innerhalb dieser Familie sind viele Konzepte gleich.
Die andere Familie ist die auf Prototypen basierende OOP. Diese Sprachen sehen in ihrer OOP-Implementierung sehr unterschiedlich aus. Das wahrscheinlich bekannteste Beispiel hierfür ist Javascript, aber Javascript hat diese Ideen aus Scheme und Object LISP kopiert. Dies sind weniger bekannte Sprachen, die normalerweise dynamisch typisiert werden. Ich kann mir keine statisch typisierte prototypbasierte Sprache vorstellen, aber das bedeutet nicht, dass es keine gibt. Sie können es hier nachlesen: http://en.wikipedia.org/wiki/Prototype-based_programming . Der Punkt ist, dass sie sich OOP auf eine ganz andere Art und Weise nähern als die klassenbasierten Sprachen. Das bedeutet, dass Konzepte zwischen diesen beiden Familien nicht so portabel sind. Nur weil Sie OO in einer Familie kennen, heißt das nicht, dass Sie diese Ideen leicht auf die andere Familie übertragen können.
Denken Sie daran, dass die meisten Programmiersprachen Konzepte aus vielen Ideen mischen. Python und Ruby integrieren sowohl OOP- als auch funktionale Programmierideen in ihre Sprachen. Und Sie können prototypbasiertes OO mit bestimmten Erweiterungen für klassenbasierte Sprachen mischen, um es noch komplexer zu gestalten.
quelle
OOP ist ein Prinzip der Programmierung - es ist im Grunde eine Idee. Die Implementierung von OOP variiert je nach Programmiersprache - aber die Säulen (Abstraktion, Vererbung, Kapselung und Polymorphismus) von OOP sind normalerweise in irgendeiner Form vorhanden.
Ich werde ohne Bevorzugung einer der beiden Sprachen sagen, dass Java die Semantik für den Programmierer etwas härter drückt als Python.
Beispielsweise,
Java-Code:
class Cat extends Animal {}
Ist etwas offensichtlicher, was Sie unter OOP-Gesichtspunkten tun, als:
Python-Code:
class Cat(Animal):
Sicher definieren beide eine Klassenhierarchie, in der Cat von Animal erbt. Ich bin jedoch der Meinung, dass für einen Programmierer, der gerade erst mit OOP anfängt, die Anwendung und die Auswirkungen von OOP-Ideen in Java möglicherweise etwas besser bleiben, da dies für den Programmierer klar ist.
quelle
Sie fragen explizit, welche Sprache am einfachsten ist, um OOP-Konzepte zu lernen. Ich denke, die Antwort ist klar: Python .
Um zu zeigen, warum dies der Fall ist, schauen wir uns das typische Anfängerprogramm in Java vs Python an. Lassen Sie uns ein einfaches Ratespiel mit höheren und niedrigeren Werten erstellen.
Java
In Java schreiben Sie eine Spielklasse.
Ich bin ein erfahrener Programmierer und selbst ich habe Schwierigkeiten. Schauen Sie sich außerdem an, was Sie einem potenziellen Schüler für dieses einfache Programm erklären müssen:
this.
Notation für den Verweis auf Variablen, wenn diese von anderen maskiert werdenSystem.out
ist ein outputStream. Und ja, es ist ein Feld, aber es ist einstatic
Feld.String[]
ist ein Array. Es ist eine besondere Art von Objekt, aber nicht wirklich.int
ist ein primitiver Typ. Es ist etwas Besonderes.Python
Python ist viel "reiner". Es gibt keine primitiven Typen. Ein Konstruktor existiert nicht, es gibt nur eine spezielle Methode, die bei der Initialisierung aufgerufen wird.
Sie müssen nicht mit der Konsole interagieren, da Sie eine haben
REPL
. Sie können das Spiel einfach mitg.guess(35)
einer Zeichenfolge spielen und zurückgeben.Dies erleichtert das Erlernen und Erfassen der grundlegenden OOP-Konzepte.
quelle
Die Kernidee in OOP besteht darin, Variablen und Methoden innerhalb von Klassen zusammenzufassen (was bedeutet, dass sie gebündelt oder ausgeblendet werden) (was Python absolut unterstützt). Es geht darum, Ihren Code um Substantive herum zu entwerfen. Dann geht es irgendwie weiter.
Zwar gibt es Implementierungsunterschiede (z. B. Python unterstützt die Sichtbarkeit nicht wie Java) und Syntaxunterschiede (in Javascript müssen Sie Methoden selbst erben), das grundlegende Design bleibt jedoch gleich.
Ich denke jedoch, dass es einfacher ist, OOP in einer Sprache wie Java zu lernen, da die Sprache dies erfordert und die Community weniger dagegen ist als beispielsweise die Python-Community.
Aber es gibt jede Menge Schreiben über OOP-Design und -Praktiken, und das Lesen ist keine Verschwendung. Selbst wenn ich Python schreibe (was sehr viel ist), schreibe ich viele Objekte und verwende viele Objekte aus Bibliotheken von Drittanbietern.
quelle
Wenn Sie OOP in einer Sprache lernen, beginnen Sie in dieser Sprache zu denken. Die Sprache beeinflusst, was Ihrer Meinung nach getan werden kann und wie und verleiht OOP einen besonderen Geschmack.
Einige Leute können OOP nicht ohne Unterricht machen. Einige müssen ihre Objekte mit dem Prozess töten.
Es gibt einen Kern von OOP und die ursprünglichen Ideen dazu. Sie können sich auch Smalltalk, Self, Simula, LISP, Newspeak ansehen. Und auch ein Blick auf Nicht-OOP-Sprachtypen wie Datenflusssprachen bash, APL, J. Logische Prolog. Haskell (Typklassen). Sie alle werden Ihnen ein anderes Denken beibringen, und das können Sie lernen
Und am Ende können Sie sehen, wofür OOP gut ist. Zumindest haben Sie eine andere Idee dazu. Ich schlage vor, Gespräche von Alan Kay zu finden .
Wenn Sie sich die Sprachen nicht ansehen, ist dieser Beitrag nutzlos.
Wie Sie hier sehen können: Wir können uns nicht darauf einigen, was OOP ist.
quelle