2017-12-27 12 views
1

Ich versuche, eine 3D-Grafik-Engine mit Python 3.6, Tkinter und speziell NOT Pygame (oder anderen 3D-Grafik-Engines) als Teil einer Universität Zuordnung zu erstellen.Python 3.6: Objektinstanzname zum Erhöhen von Fehlern verwenden

Innerhalb dieses Projekts musste ich eine "Matrix" -Klasse erstellen, die es mir ermöglicht, mxn-Matrizen einfach zu erstellen und zu bearbeiten. Ich glaube, dass dies für die Transformation von Vektoren entscheidend ist, um Objekte auf einem 2-D-Display anzuzeigen.

Eine Methode, die meine Matrix-Klasse enthalten soll, ist Matrixmultiplikation. Ich dachte, die erste (und wichtigste) Sache, die man bei der Durchführung dieser Methode überprüfen sollte, ist sicherzustellen, dass die Breite der ersten Matrix gleich der Höhe der zweiten Matrix ist, da dies notwendig ist, um zwei Matrizen miteinander zu multiplizieren.

Wenn die beiden Matrizen nicht miteinander multipliziert werden kann, erhebe ich eine Typeerror, in dem ich

"Matrixmultiplikation nicht möglich sagen, wollen Breite von {Vornamens Matrix}. ({Wert }) ist nicht gleich der Höhe von {zweiter Matrixname}: ({Wert}) ".

zB

apple = Matrix(2, 3, List_of_values) 
#creates a matrix instance that is 2x3 and contains 6 values from a list 

pear = Matrix(4, 3, Another_list_of_values) 
#creates a matrix that is 4x3 and contains 12 values from another list 

apple.multiply(pear) 

Dies soll, wenn alles funktioniert, Versuch {Apfel x Birne} mathematische Operation, speziell mit Apfel auszuführen ersten und Birne zweiter

In diesem Fall Multiplikation offensichtlich nicht möglich: Apfel ist 2 hoch und 3 breit, und Birne ist 5 hoch und 3 breit. Ich möchte einen Fehler erhöhen, wie:

TypeError: Matrix multiplication not possible: Width of apple (3) is not equal to height of pear (4) 

Stattdessen bekomme ich diese:

TypeError: Matrix multiplication not possible: Width of <__main__.Matrix object at 0x1056117b8> (3) is not equal to height of <__main__.Matrix object at 0x105618e80> (4) 

Ich glaube, ich brauche das __name__ Attribut in meiner Matrix-Klasse zu definieren, so dass, wenn Apple .__ name__ ist aufgerufen, gibt es einen String zurück, der den Namen "apple" enthält. Ist das möglich? Ist das überhaupt eine gute Idee? Gibt es eine bessere Kodierungspraxis, die ich stattdessen befolgen sollte?

Dank

+1

Das ist keine gute Idee. Was passiert, wenn das Objekt mehr als einem Namen zugewiesen wird oder keiner (z. B. wenn es nur über eine Sammlung wie eine Liste oder ein Wörterbuch zugänglich ist)? Insbesondere die Verwendung von '__name__' ist eine schlechte Idee, erfinden Sie nicht Ihre eigenen Verwendungen für die reservierten Identifikatoren. Geben Sie einfach eine sinnvolle ['__repr__'-Implementierung] (https://docs.python.org/3/reference/datamodel.html#object.__repr__), damit Sie sehen können, welche Werte bei Bedarf verwendet werden. – jonrsharpe

+0

Hallo Jon, danke für die Antwort, Also denken Sie, es ist in der Regel nur ein schlechter Weg zu gehen? Ich dachte, es wäre wichtig, in der Lage zu sein, herauszufinden, ob inkompatible Matrizen miteinander multipliziert werden, aber ich denke nicht, dass es entscheidend ist. Im Allgemeinen möchte ich nur bessere Programmierpraktiken lernen, also war Ihre Antwort wirklich hilfreich - obwohl die kurze Antwort "nicht" war! Cheers –

+0

Die Variablennamen, die beim Speichern eines Verweises auf das Objekt verwendet werden, sind nicht Teil des Objekts. Das gleiche Objekt kann mehrere Namen haben. –

Antwort

0

Ich wollte diese Frage markieren, wie beantwortet: jonrsharpe ‚s Antwort in den Kommentaren es gut erklärt, und Bryan Oakley einige hilfreiche Zusatzinformationen hinzugefügt. Danke euch beiden.