Ich programmiere seit ungefähr zwei Jahren in Python. Meistens Daten (Pandas, MPL, Numpy), aber auch Automatisierungsskripte und kleine Web-Apps. Ich versuche, ein besserer Programmierer zu werden und mein Python-Wissen zu erweitern. Eines der Dinge, die mich stören, ist, dass ich noch nie eine Klasse verwendet habe (außerhalb des Kopierens von zufälligem Flask-Code für kleine Web-Apps). Ich verstehe im Allgemeinen, was sie sind, aber ich kann mich nicht darum kümmern, warum ich sie für eine einfache Funktion benötigen würde.
Um meiner Frage mehr Spezifität zu verleihen: Ich schreibe Tonnen von automatisierten Berichten, bei denen immer Daten aus mehreren Datenquellen (Mongo, SQL, Postgres, API) abgerufen, viele oder wenige Daten mungiert und formatiert und die Daten in csv / excel geschrieben werden / html, senden Sie es in einer E-Mail. Die Skripte reichen von ~ 250 Zeilen bis ~ 600 Zeilen. Gibt es einen Grund für mich, dafür Klassen zu verwenden und warum?
Antworten:
Klassen sind die Säule der objektorientierten Programmierung . OOP befasst sich stark mit der Organisation, Wiederverwendbarkeit und Kapselung von Code.
Erstens ein Haftungsausschluss: OOP steht teilweise im Gegensatz zu Functional Programming , einem anderen Paradigma, das in Python häufig verwendet wird. Nicht jeder, der in Python (oder sicherlich in den meisten Sprachen) programmiert, verwendet OOP. In Java 8 können Sie viel tun, was nicht sehr objektorientiert ist. Wenn Sie OOP nicht verwenden möchten, tun Sie dies nicht. Wenn Sie nur einmalige Skripte schreiben, um Daten zu verarbeiten, die Sie nie wieder verwenden werden, schreiben Sie weiter so, wie Sie sind.
Es gibt jedoch viele Gründe, OOP zu verwenden.
Einige Gründe:
Organisation: OOP definiert bekannte und standardmäßige Methoden zur Beschreibung und Definition von Daten und Prozeduren im Code. Sowohl Daten als auch Prozeduren können auf verschiedenen Definitionsebenen (in verschiedenen Klassen) gespeichert werden, und es gibt Standardmethoden, um über diese Definitionen zu sprechen. Das heißt, wenn Sie OOP auf standardmäßige Weise verwenden, hilft dies Ihrem späteren Selbst und anderen, Ihren Code zu verstehen, zu bearbeiten und zu verwenden. Anstatt einen komplexen, willkürlichen Datenspeicherungsmechanismus zu verwenden (Diktate von Diktaten oder Listen oder Diktate oder Listen von Diktaten von Mengen oder was auch immer), können Sie auch Teile von Datenstrukturen benennen und bequem darauf verweisen.
Status: Mit OOP können Sie den Status definieren und verfolgen. Wenn Sie beispielsweise in einem klassischen Beispiel ein Programm erstellen, das Schüler verarbeitet (z. B. ein Notenprogramm), können Sie alle Informationen, die Sie über sie benötigen, an einem Ort aufbewahren (Name, Alter, Geschlecht, Klassenstufe, Kurse, Noten, Lehrer, Gleichaltrige, Ernährung, besondere Bedürfnisse usw.), und diese Daten bleiben erhalten, solange das Objekt lebt und leicht zugänglich ist.
Kapselung : Bei der Kapselung werden Prozedur und Daten zusammen gespeichert. Methoden (ein OOP-Begriff für Funktionen) werden direkt neben den Daten definiert, mit denen sie arbeiten und die sie erzeugen. In einer Sprache wie Java, die Zugriffskontrolle ermöglicht , oder in Python, je nachdem, wie Sie Ihre öffentliche API beschreiben, bedeutet dies, dass Methoden und Daten vor dem Benutzer verborgen werden können. Dies bedeutet, dass Sie, wenn Sie Code benötigen oder ändern möchten, alles tun können, um den Code zu implementieren, aber die öffentlichen APIs gleich lassen.
Vererbung : Mit Vererbung können Sie Daten und Prozeduren an einem Ort (in einer Klasse) definieren und diese Funktionalität später überschreiben oder erweitern. In Python sehe ich beispielsweise häufig Leute, die Unterklassen der
dict
Klasse erstellen , um zusätzliche Funktionen hinzuzufügen. Eine häufige Änderung besteht darin, die Methode zu überschreiben, die eine Ausnahme auslöst, wenn ein Schlüssel aus einem nicht vorhandenen Wörterbuch angefordert wird, um einen Standardwert basierend auf einem unbekannten Schlüssel anzugeben. Auf diese Weise können Sie Ihren eigenen Code jetzt oder später erweitern, anderen erlauben, Ihren Code zu erweitern, und Sie können den Code anderer Personen erweitern.Wiederverwendbarkeit: Alle diese und andere Gründe ermöglichen eine bessere Wiederverwendbarkeit von Code. Mit objektorientiertem Code können Sie festen (getesteten) Code einmal schreiben und dann immer wieder verwenden. Wenn Sie etwas für Ihren speziellen Anwendungsfall optimieren müssen, können Sie von einer vorhandenen Klasse erben und das vorhandene Verhalten überschreiben. Wenn Sie etwas ändern müssen, können Sie alles ändern, während Sie die vorhandenen öffentlichen Methodensignaturen beibehalten, und niemand ist (hoffentlich) klüger.
Auch hier gibt es mehrere Gründe, OOP nicht zu verwenden, und Sie müssen es nicht. Aber zum Glück können Sie mit einer Sprache wie Python nur ein bisschen oder viel verwenden, es liegt an Ihnen.
Ein Beispiel für den Anwendungsfall eines Schülers (keine Garantie für die Codequalität, nur ein Beispiel):
Objektorientierte
Standard Dikt
quelle
Wann immer Sie einen Zustand Ihrer Funktionen beibehalten müssen und dies nicht mit Generatoren erreicht werden kann (Funktionen, die eher nachgeben als zurückkehren). Generatoren behalten ihren eigenen Zustand bei.
Wenn Sie einen der Standardoperatoren überschreiben möchten , benötigen Sie eine Klasse.
Wann immer Sie ein Besuchermuster verwenden, benötigen Sie Klassen. Jedes andere Entwurfsmuster kann mit Generatoren, Kontextmanagern (die auch besser als Generatoren als als Klassen implementiert sind) und POD-Typen (Wörterbücher, Listen und Tupel usw.) effektiver und sauberer ausgeführt werden.
Wenn Sie "pythonischen" Code schreiben möchten, sollten Sie Kontextmanager und Generatoren Klassen vorziehen. Es wird sauberer sein.
Wenn Sie die Funktionalität erweitern möchten, können Sie dies fast immer eher mit Eindämmung als mit Vererbung erreichen.
Dies hat in der Regel eine Ausnahme. Wenn Sie die Funktionalität schnell kapseln möchten (dh Testcode anstelle von wiederverwendbarem Code auf Bibliotheksebene schreiben möchten), können Sie den Status in einer Klasse kapseln. Es ist einfach und muss nicht wiederverwendbar sein.
Wenn Sie einen Destruktor im C ++ - Stil (RIIA) benötigen, möchten Sie auf keinen Fall Klassen verwenden. Sie möchten Kontextmanager.
quelle
Generator
Instanz (einen speziellen Iterator) zurückgeben, während Schließungen eine beliebige Signatur haben können. Grundsätzlich können Sie Klassen die meiste Zeit vermeiden, indem Sie Abschlüsse erstellen. Und Verschlüsse sind nicht nur "Funktionen, die im Kontext anderer Funktionen definiert sind".Ich denke du machst es richtig. Klassen sind sinnvoll, wenn Sie eine Geschäftslogik oder schwierige reale Prozesse mit schwierigen Beziehungen simulieren müssen. Zum Beispiel:
Ich empfehle Ihnen auch, dieses klassische Video anzusehen
quelle
Eine Klasse definiert eine reale Entität. Wenn Sie an etwas arbeiten, das einzeln existiert und eine eigene Logik hat, die von anderen getrennt ist, sollten Sie eine Klasse dafür erstellen. Zum Beispiel eine Klasse, die die Datenbankkonnektivität kapselt.
Ist dies nicht der Fall, muss keine Klasse erstellt werden
quelle
Das hängt von Ihrer Idee und Ihrem Design ab. Wenn Sie ein guter Designer sind, werden OOPs auf natürliche Weise in Form verschiedener Designmuster herauskommen. Für eine einfache Verarbeitung auf Skriptebene können OOPs Overhead sein. Betrachten Sie einfach die grundlegenden Vorteile von OOPs wie wiederverwendbar und erweiterbar und stellen Sie sicher, ob sie benötigt werden oder nicht. OOPs machen komplexe Dinge einfacher und einfacher. Halten Sie die Dinge einfach so oder so mit OOPs oder nicht mit OOPs. was immer einfacher ist, benutze das.
quelle