Vektor in python
Ich arbeite an diesem Projekt, das sich mit Vektoren in python. Aber ich bin neu in python und weiß nicht wirklich, wie es zu knacken. Hier ist die Anleitung:
"Fügen Sie einen Konstruktor hinzu der Vector-Klasse. Der Konstruktor sollte nehmen ein einzelnes argument. Wenn dieses argument ist entweder ein int oder eine long-oder eine Instanz einer Klasse, abgeleitet von einer von diesen, dann betrachten Sie dieses argument, um die Länge der Vector-Instanz. In diesem Fall konstruieren Sie einen Vektor, der die angegebene Länge, bei dem jedes element wird initialisiert, 0.0. Wenn die Länge negativ ist, heben ValueError mit einer entsprechenden Meldung. Wenn das argument nicht als die Länge, dann wenn das argument eine Sequenz (z.B. eine Liste), dann initialisieren mit Vektor mit der Länge und den Werten der angegebenen Reihenfolge. Wenn das argument nicht verwendet werden, da die Länge des Vektors und wenn es nicht eine Folge, dann heben Sie einen TypeError mit einer entsprechenden Meldung.
Nächsten Umsetzung der __repr__
Methode, um einen string zurückzugeben, der python-code, der verwendet werden könnte, zum initialisieren des Vektors. Dieser string der code sollte aus dem Namen der Klasse gefolgt von einer öffnenden Klammer, gefolgt von dem Inhalt des Vektors dargestellt als eine Liste, gefolgt von einem engen Klammern."
Ich bin mir nicht sicher, wie Sie die Klasse der Typ-Prüfung, als auch, wie Sie initialisiert den Vektor basierend auf dem gegebenen Objekt. Könnte mir bitte jemand helfen mit diesem? Danke!
- möglich, Duplikat der Was ist die beste (idiomatischen) Möglichkeit zu prüfen, die Art der Python-variable?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Lehrer scheint gar nicht zu "sprechen Python als native language". 😉 Das gesamte Konzept für die Klasse ist ziemlich albern; echten Python-Programmierer verwenden Sie einfach die integrierte Sequenz-Typen direkt. Aber dann, diese Art der Sache ist normal für Akademische übungen, leider...
In Python, die gemeinsame "dies ist, wie Sie ein neues Objekt erstellen und sagen, was es ist, eine Instanz von" Zeug ist intern standardmäßig, und dann das baby-Objekt übergeben, um die Klasse' Initialisierung Methode, um es in eine "richtige" Instanz durch Einstellung der Attribute, dass neue Instanzen der Klasse haben sollte. Wir nennen diese Methode
__init__
.Dies ist getestet mit der builtin-Funktion
isinstance
. Sie können schauen Sie sich in der Dokumentation (oder versuchenhelp(isinstance)
an der REPL).In unserem
__init__
wir in der Regel weisen Sie einfach die Startwerte für die Attribute. Der erste parameter__init__
ist das neue Objekt wir sind die Initialisierung, die wir gewöhnlich als "selbst" so, dass die Menschen verstehen, was wir tun. Die restlichen Argumente sind auch immer übergeben, wenn der Aufrufer eine Instanz angefordert. In unserem Fall, sind wir immer erwartet genau ein argument. Es könnte verschiedene Arten und verschiedene Bedeutungen haben, so sollten wir es ein generischer name.Wenn wir erkennen, dass das generische argument ist ein integer-Typ mit
isinstance
wir "bauen" den Vektor, indem Sie die entsprechenden Daten. Wir weisen nur auf ein Attribut desself
(nennen wir es was auch immer Sinn macht), und der Wert sein wird... nun, was werden Sie verwenden, um repräsentieren die Vektor-Daten intern? Hoffentlich haben Sie schon darüber nachgedacht 🙂Oh, guter Punkt... sollten wir prüfen, bevor wir versuchen, bauen unser Lager. Einige der offensichtlichen Möglichkeiten, es zu tun, würde im Grunde zu behandeln, eine negative Zahl ist das gleiche wie null. Andere Möglichkeiten könnten eine Ausnahme auslösen, die wir nicht bekommen, zu kontrollieren.
"Sequenz" ist eine viel unschärfer Konzept; die Listen und Tupeln und was nicht, nicht eine "sequence" - Basis-Klasse, so können wir nicht einfach überprüfen diese mit
isinstance
. (Nachdem alle, könnte jemand einfach erfinden eine neue Art von Sequenz, die wir gar nicht denken). Der einfachste Weg, um zu überprüfen, ob etwas eine Folge ist, um zu versuchen zu erstellen einen iterator, mit dem eingebauteniter
Funktion. Das wird schon heben eine ziemlich sinnvolleTypeError
wenn das Ding nicht iterierbar (ausprobieren!), so macht die Fehlerbehandlung einfach - wir lassen Sie es seine Sache.Vorausgesetzt, wir haben einen iterator, können wir leicht zu erstellen, unser Speicher: die meisten Sequenz-Typen (und ich nehme an, Sie haben einen von Ihnen im Hinterkopf bereits, und das ist sicherlich enthalten) akzeptieren einen iterator für Ihre
__init__
Methode und tun, die offensichtliche Sache zu kopieren Sie die Sequenz-Daten.Dies ist hoffentlich selbsterklärend. Hinweis: Sie sollten in der Lage sein, um dies zu vereinfachen, indem die in der Speicher-Attribut eigenen
__repr__
. Auch erwägen, string-Formatierung, um den string zusammen.__new__
ist. Wenn Sie anrufenSomeClass(some, args)
in Python das system magisch erzeugt ein "leeres" Objekt, und dann die__init__
Methode derSomeClass
bekommt Steuerelement füllen Sie die leeren Objekt. Dies ist genau wie Konstruktoren Arbeit in Java/C++; das Objekt bereits vorhanden ist, durch die Zeit, die Konstruktor-code erhält die Kontrolle, die durch das system bereitgestellt. Die offizielle Python-Dokumentation für__init__
selbst bezeichnen es als einen Konstruktor hier: docs.python.org/reference/datamodel.html#basic-customization__init__
können (obwohl Sie natürlich nicht sollte). Die Definitionen sind subjektiv, und das system funktioniert wirklich anders. Es gibt nichts in Python, das ist ganz Analog zu einem C++ - Initialisierungs-Liste, oder in Java ist die Einstellung der default-Werte für Elemente oder Instanz-Initialisierung blockiert. Ich denke nicht, dass es Fehlinformationen und ich finde Ihren Vorwurf eher schädlich.__init__
ist kein Konstruktor, weil es nicht das Objekt erstellen, nur ihn initialisieren", ohne wirklich darüber nachzudenken. Auf top von, dass die Behauptung, dass__new__
ist ein Konstruktor ist absurd; es ist nichts, wie ein Java - /C++ - Konstruktor.__init__
ist kein Konstruktor; Sie beschrieben__init__
in Bedingungen, die genau auf eine andere Sprache die Konstruktoren. Ja, es gibt Unterschiede, ja, es ist gut, darauf hinzuweisen; aber sagen neue Python-Programmierer "jetzt darfst du nicht verwechseln__init__
mit Konstruktoren aus anderen Sprachen, es ist kein Konstruktor" ist einfach nur verwirrend, besonders, wenn die offiziellen docs do finden__init__
als Konstruktor.Alles, was Sie brauchen, um loszulegen ist hier:
http://docs.python.org/library/functions.html
Gibt es viele Beispiele, wie check-Typen in Python auf StackOverflow (siehe mein Kommentar für die top-rated).
Zum initialisieren einer Klasse, verwenden Sie die
__init__
Methode:Rufen Sie nun:
Und in anderen Funktionen in
Vector
finden Sie inself._internal_list
. Ich legte_
vor den Namen der Variablen an, dass es nicht geändert werden soll, die von außerhalb der Klasse.Den Dokumentation für die
list
- Funktion kann nützlich sein für Sie.Können Sie die Typüberprüfung mit isinstance.
Die Initialisierung einer Klasse mit gemacht mit einem __init__ Methode.
Glück mit deiner Arbeit 🙂
Dies kann oder kann nicht angemessen sein, je nach den Hausaufgaben, aber in der Python-Programmierung ist es nicht sehr üblich ist, explizit zu überprüfen, die Art der Argumente und änderung des Verhaltens, die Grundlage. Es ist mehr normal, zu versuchen, einfach nur die Funktionen, die Sie erwarten, dass es (eventuell Ausnahmen abfangen, wenn notwendig, zurückgreifen, um andere Optionen).
In diesem besonderen Beispiel, ein normales Python-Programmierer die Implementierung eines Vektor, der benötigt wird, um auf diese Weise funktionieren würde versuchen, mit dem argument als wenn es ein integer/long (Tipp: was passiert, wenn man multipliziert eine Liste mit einem integer?) zum initialisieren der Vektor-und wenn das eine Ausnahme auslöst, versuchen Sie es als wenn es gab eine Sequenz, und wenn das versagt auch dann können Sie werfen eine
TypeError
.Der Grund dafür ist, dass es lässt Sie Ihre Klasse offen für die Zusammenarbeit mit anderen Objekttypen die Leute kommen später, die sind nicht ganze zahlen oder Sequenzen, aber die Arbeit gefällt Ihnen. Insbesondere ist es sehr schwierig, umfassend zu prüfen, ob etwas eine "Sequenz", weil Benutzer-definierten Klassen verwendet werden können als Sequenzen, die nicht an Instanzen einer gemeinsamen Art, die Sie überprüfen können. Die Vector-Klasse selbst ist ein Recht guter Kandidat für die Verwendung zu initialisieren einen Vektor, zum Beispiel!
Aber ich bin mir nicht sicher, ob dies die Antwort auf Ihre Lehrer von Ihnen erwarten. Wenn Sie noch nicht gelernt haben, über die Ausnahmebehandlung noch, dann bist du fast sicher nicht gedacht, um diesen Ansatz verwenden, so ignorieren Sie bitte meinen Beitrag. Viel Glück mit deinem lernen!