2010-10-21 3 views
8

Ich habe einige Leute gesehen, die Python-Code geschrieben haben, indem sie eine Klasse erstellt haben und dann ein Objekt, um alle Methoden aufzurufen. Gibt es einen Vorteil der Verwendung von Klassen, wenn wir keine Vererbung, Kapselung usw. verwenden? Ein solcher Code scheint mir weniger sauber zu sein mit all diesen "Selbst" -Argumenten, die wir vermeiden könnten. Ist diese Praxis von anderen Programmiersprachen wie Java abhängig oder gibt es einen guten Grund, warum Python-Programme so strukturiert sein sollten?Gibt es einen Grund für die Verwendung von Klassen in Python, wenn nur eine Klasse im Programm vorhanden ist?

Beispielcode:

class App: 

# all the methods go here 

a = App()  
+2

Es scheint mir, dass es nur ein Relikt von anderen Sprachen wie Java ist, die alle Code in einer Klasse haben. Aber ich werde jemanden mit mehr Erfahrung einen besseren Grund geben lassen. –

Antwort

7

Ein Vorteil, wenn auch nicht immer anwendbar, ist, dass es macht es einfach, durch Subklassen die eine Klasse das Programm zu verlängern. Zum Beispiel kann ich eine Unterklasse erstellen und die Methode überschreiben, die beispielsweise von einer CSV-Datei liest, um eine XML-Datei zu lesen, und dann die Unterklasse oder Originalklasse basierend auf Laufzeitinformationen instanziieren. Von dort kann die Logik des Programms normal fortfahren.

Das wirft natürlich die Frage auf, ob das Lesen der Datei wirklich in der Verantwortung der Klasse liegt oder richtiger zu einer Klasse gehört, die Unterklassen zum Lesen verschiedener Datentypen hat und eine einheitliche Schnittstelle zu diesen Daten darstellt, aber das ist natürlich, eine andere Frage. Ich persönlich finde, dass es der sauberste Weg ist, Funktionen, die starke Annahmen über ihre Parameter treffen, auf die entsprechende Klasse als Methoden zu setzen und Funktionen zu setzen, die sehr schwache Annahmen über ihre Argumente im Modul als Funktionen machen.

+2

+1. Ich mag es, meine Apps als untergeordnete Anwendungsobjekte zu verpacken, so dass sie von einer Unterklasse angepasst werden können und verschiedene angepasste Versionen parallel ausgeführt werden können (was mit Affepatching nicht möglich wäre). Dies beinhaltet tendenziell viele innere Klassen, auch unterklassierbar, für kompliziertere Apps. – bobince

+0

Das macht vollkommen Sinn. Danke Aaronasterling und Bobince! – Thea

+0

Ich mag Ihre Begründung; Ich denke, es wird beeinflussen, wie ich Code. – Alan

4

Ich mache oft das selbe selbst für die Manager-Teile einer App, die theoretisch auf einfache, sehr sequenzielle, funktionale Programmierung reduziert werden könnte. Der Hauptvorteil (für mich) besteht darin, dass es Ihre Hauptschleife oder Ihre Run-Once-Ausführung gut kapselt und es erlaubt, diese Daten effizient und sauber über mehrere Blöcke hinweg zu konfigurieren und persistent zu machen benötigt, ohne den Code selbst ändern zu müssen. Ganz zu schweigen von der Möglichkeit, eine Ausführung in eine andere und erweiterte Klasse zu unterteilen.

Es ist auch viel einfacher, das Main auf diese Weise zu erweitern, dann ist es, wenn Sie einen soliden Block von 200 Zeilen haben, die ziemlich kryptisch umschriebenes Zeug umwerfen.

Das Selbst, nachdem Sie genug Python schreiben, geht irgendwie als eine Behinderung weg, und persönlich mag ich, wie es sofort eine visuelle Unterscheidung zwischen dem bietet, was ich offensichtlich über Bereiche bestehen will, und was ein wegwerfbares Element ist, das ich MÜSSEN Sie den Umfang nicht mehr nutzen und werden Sie abgeholt, sobald ein bestimmter Schritt getan ist.

Last but not least, werden einige Menschen objecten alles, was sie in die Hände bekommen, oder werden nicht in der Lage, es zu lesen. Ich bin einer von ihnen :)

+0

Nun, Sie können immer eine Hauptfunktion für Ihre "Run-Once-Ausführung" verwenden, aber wenn Sie das Programm in der Zukunft erweitern möchten, ist es sinnvoll, ein objektorientiertes Design zu haben. Danke für deine Antwort :) – Thea

3

1. Ich kenne eine Verwendung dafür.

Obwohl dies mit anderen Mitteln erreicht werden kann. Es stellt sicher, dass beide Module - Modul_B und Modul_C die gleiche Instanz von App verwenden und keine separaten Objekte instanziieren.

In module_A.py

class App: 
    .... 

a = App() 

In module_B.py

from module_A import a 

In module_C.py

Natürlich könnten Sie separate Objekte erstellen, aber das war nicht die Absicht der oben genannten Module.

Was passiert, wenn Sie die folgenden in module_D.py

tat
from module_A import App 
a = App() 

2. [Pedantic]

Sie könnten mithilfe von Klassen vermeiden und Ihre Lösung mit nur Module und Funktionen zersetzen. Aber wird das in einem großen Programm nicht hässlich aussehen? Möchten Sie nicht objektorientiertes Paradigma in Ihrem Programm verwenden? Alle Sprachen bieten bestimmte Möglichkeiten, OO zu nutzen. Wir alle mögen das eine oder das andere und manche schalten uns ab. Explizit ist besser als implizit ist normalerweise der Python-Weg. Obwohl das nicht genug Grund für seine Aufnahme ist.

+0

Vielen Dank! Sehr, sehr hilfreich :) – Thea

1

Gibt es einen Vorteil der Verwendung von Klassen, wenn wir keine Vererbung, Kapselung usw. verwenden?

Ja.

diese Praxis ein Einfluss von anderen Programmiersprachen wie Java

Nr

es einen guten Grund, warum Python-Programme sollte so strukturiert sein?

Ja.

Jedoch. Aus Ihrer Frage haben Sie eindeutig entschieden: "Ein solcher Code scheint mir weniger sauber zu sein mit all diesen, Selbst- Argumenten".

Es ist nicht viel Sinn, die Vorteile einer Klassendeklaration zu erklären, wenn Sie bereits sicher sind, dass sie "weniger sauber" ist.

Betrachten Sie dies.

  1. Ein Skript ist niemals statisch.
  2. Ein klassenfreies Design muss geändert werden.
  3. Irgendwann werden die Änderungen zu einer zweiten Klasse führen.

Unterm Strich.

Sie können für kurze Momente ohne Klasse arbeiten. Bis Sie Änderungen vornehmen. Dann werden Sie es bereuen, das Wort class und all diese "unsauberen" Argumente nicht zu haben.

Sie werden sie schließlich hinzufügen.

Warum warten?

2

Ich neige dazu, Klassen zu verwenden, wenn ich denke, dass es wahrscheinlich ist, dass ich mehrere Instanzen von etwas benötige, oder wenn ich denke, dass das Erben davon nützlich sein wird. Wenn ich nur nach einer Möglichkeit suche, verwandte Funktionen und Einstellungen zu gruppieren, die ihr Verhalten beeinflussen, dann kann ein Modul mit weniger Syntax dafür ebenso gut funktionieren.Manchmal werde ich beide Ansätze im selben Modul verwenden.

Auch wenn Sie Dekoratoren und Kontextmanager als Klassen schreiben können, tendiere ich persönlich dazu, sie klarer zu finden, wenn sie als Funktionen geschrieben werden, also schreibe ich sie so.

Python ist eine Programmiersprache mit mehreren Paradigmen. Verwenden Sie jeden Ansatz, der Ihrer Meinung nach am deutlichsten ist. Sie brauchen nie , um OO zu verwenden. Ein Ansatz, den ich gerne benutze, ist zu überlegen, wie ich die verschiedenen Funktionen haben möchte, die mir zur Verfügung gestellt werden, wenn jemand anderes ein Modul schreiben würde, um ein Problem wie das meine generisch zu lösen. Grundsätzlich versuche ich zunächst, die Schnittstellen zwischen meinen Modulen zu gestalten und so einfach wie möglich zu gestalten. An diesem Punkt wird mir klar, welchen Ansatz ich für jede Funktionalität verwenden sollte.

Aber ich bin nur ein Typ, und Programmierung ist nicht meine Hauptaufgabe.

+0

Ich habe immer gedacht, Kontext-Manager als Funktionen seltsam und crafty aussehen. Ich bin bei dir im Denken, wenn es möglich ist, eine Funktion als Dekorateur zu verwenden, ist es in den meisten Fällen das Richtige. – aaronasterling

+0

Jedem sein eigenes, und natürlich können sich meine Meinungen ändern, während ich mehr über Python lerne. Was ich an Kontextmanagern als Funktionen mag, ist, dass Sie keine Instanzvariablen verwenden müssen, wenn Sie den Zustand zwischen Ihrem '__enter __()' und '__exit() __' teilen wollen. Nur einfache alte Ortsansässige funktionieren gut. – kindall

Verwandte Themen