Ich bin neu bei Python und Programmierung im Allgemeinen, daher würde ich jede Klärung in diesem Punkt sehr begrüßen.
Zum Beispiel im folgenden Code:
%Vor%Die reine Funktionsversion scheint sauberer und liefert das gleiche Ergebnis.
Ist der primäre Wert von Klassen, die Sie erstellen und eine Anzahl von Methoden für ein Objekt aufrufen können, z. kämpfen oder schlafen?
Ihr Beispiel ist ziemlich vereinfacht.
In einem vollständigeren Beispiel würde das Kämpfen nicht nur den aktuellen Zustand anzeigen, sondern auch diesen Zustand ändern. Ihr Monster könnte verletzt werden und das würde seine Lebenspunkte und Moral verändern. Dieser Zustand muss irgendwo gespeichert werden. Wenn Sie eine Klasse verwenden, ist es natürlich, Instanzvariablen hinzuzufügen, um diesen Zustand zu speichern.
Unter Verwendung nur von Funktionen wäre es schwieriger, einen guten Ort zum Speichern des Zustands zu finden.
Ihr Beispiel ist nicht besonders interessant - es druckt nur drei Zahlen. Sie brauchen keine Klassen oder sogar eine Funktion (wirklich), um das zu tun.
Aber wenn du jemals ein Programm schreiben musst, das zwei getrennte Monster gleichzeitig aufspürt, ihre Gesundheit kennt, ihre Kampffähigkeiten unterscheidet, und so, kannst du den Wert sehen, jedes Monster in einem zu kapseln separate Monsterinstanz.
Dies ist eine allgemeinere Antwort als nur für Ihren Code, aber Klassen sind nützlich, wenn Sie Folgendes brauchen:
Teilen Sie den Status sicher über bestimmte Funktionen hinweg .
Klassen bieten Kapselung, um den globalen Namensraum nicht zu verschmutzen mit Variablen, die nur über einige Funktionen verteilt werden müssen. Sie möchten nicht, dass jemand Ihren Code verwendet, um eine Variable zu überschreiben, die alle Ihre Funktionen verwenden - Sie möchten den Zugriff immer so gut wie möglich steuern können.
Klassen können instanziiert werden und mehrere unabhängige Kopien derselben Variablen haben, die nicht gemeinsam genutzt werden, während nur sehr wenig Code benötigt wird.
Sie sind geeignet, wenn Sie Interaktionen zwischen einer Sammlung von Funktionen und Variablen mit einer anderen Sammlung von Funktionen und Variablen modellieren müssen, z. B. wenn Sie Objekte modellieren müssen. Das Definieren einer Klasse für eine einzelne Funktion ohne Status ist eine Verschwendung von Code.
Überlastung des Operators oder spezifische Merkmale für bestimmte Typen definieren
Was macht int
, string
und tuples
hashable (kann als Schlüssel in einem Wörterbuch verwendet oder in set
eingefügt werden), während list
s und dict
s nicht sind?
Antwort: Die Basisklassen für diese primitiven Typen implementieren die magische Methode __hash__
, wodurch der Python-Compiler zur Laufzeit dynamisch einen Hash berechnen kann.
Wie kann der Operator +
überladen werden, so dass 5 + 2 = 7
für int
s aber 's' + 'a' = 'sa'
für Zeichenfolgen?
Antwort: Die Basisklassen für diese Typen definieren ihre eigene __add__
Methode, mit der Sie genau definieren können, wie die Addition zwischen zwei Mitgliedern Ihrer Klasse ausgeführt wird.
Alle benutzerdefinierten Klassen können diese Methoden implementieren. Es gibt gute Anwendungsfälle für sie: Größere mathematische Bibliotheken - numpy, scipy und pandas - nutzen das Überladen von Operatoren stark aus, indem sie diese magischen Methoden definieren, um Ihnen nützliche Objekte für den Umgang mit Ihren Daten zur Verfügung zu stellen. Klassen sind die einzige Möglichkeit, diese Eigenschaften und Eigenschaften in Python zu implementieren.
Klassen sind Funktionen nicht überlegen, wenn die oben genannten Bedingungen nicht erfüllt sind.
Verwenden Sie eine Klasse, um sinnvolle Funktionen und Variablen sinnvoll zusammenzufassen oder Ihren Objekten besondere Eigenschaften zu verleihen. Alles andere ist überflüssig.