Python hat keine Möglichkeit zu wissen, dass es in Funktion gebaut automatisch aufrufen sollte Ihre __Matrix__
Methode verwenden, um eine Matrix-Instanz zu drucken. Die Art und Weise, wie special method names gehandhabt wird, ist eine interne Sprachfunktion. Sie können nicht einfach neue spezielle Methodennamen hinzufügen oder die Art und Weise ändern, wie existierende behandelt werden, ohne die Python-Quelle zu ändern und Ihre eigene Version zu kompilieren. Und es ist in der Regel keine gute Idee, das zu tun, es sei denn Sie wirklich müssen. ;)
Wie ich bereits erwähnt, __str__
sollte eine Zeichenfolge zurück, die dem Benutzer angezeigt geeignet ist, ist es so wahrscheinlich keine gute Idee, diese Sequenz zurückzukehren '\\t'
und '\\n'
über __str__
enthält. Ich denke, Sie könnten es über __repr__
zurückgeben, aber das ist immer noch ein bisschen seltsam, IMHO. Ich schlage vor, dass Sie ihm einen neuen Namen geben, wie zB esc_str
.
Just for fun, habe ich eine relativ einfache __format__
Methode für Sie Klasse implementiert. Diese spezielle Methode wird von der eingebauten Funktion format
und der str.format
Methode aufgerufen. Es wird auch von der neuen f-string-Syntax aufgerufen.
Meine __format__
Methode legt die Mindestbreite fest, die für jede Spalte der Matrix erforderlich ist. Sie können eine numerische format_spec angeben, um für alle Spalten eine Mindestbreite festzulegen. Ein zusätzliches Leerzeichen wird hinzugefügt, um das Zusammenlaufen von Spalten zu verhindern. Sie könnten diese Methode verbessern, um ein initiales '>' oder '<' in format_spec zu behandeln, um die Ausrichtung anzuzeigen.
class Matrix(object):
def __init__(self, matrix = 0):
self.matrix = matrix
def __format__(self, minwidth):
minwidth = int(minwidth) if minwidth else 0
# Find maximum width of each column
widths = [max(len(str(k)) for k in col) for col in zip(*self.matrix)]
widths = [max(minwidth, u) for u in widths]
result = []
for row in self.matrix:
result.append(" ".join(["%*d" % t for t in zip(widths, row)]))
return "\n".join(result)
def __repr__(self):
return "Matrix(%s)" % self.matrix
def __str__(self):
return "\n".join(["\t".join(["%d" % k for k in row])
for row in self.matrix])
def esc_str(self):
return r"\n".join([r"\t".join(["%d" % k for k in row])
for row in self.matrix])
# test
m = Matrix([[1, 2, 3], [5, 4, 16], [9, 867, 0]])
print(repr(m))
print(m)
print(m.esc_str())
print('Matrix\n{:2}'.format(m))
print(f'Matrix\n{m}')
Ausgang
Matrix([[1, 2, 3], [5, 4, 16], [9, 867, 0]])
1 2 3
5 4 16
9 867 0
1\t2\t3\n5\t4\t16\n9\t867\t0
Matrix
1 2 3
5 4 16
9 867 0
Matrix
1 2 3
5 4 16
9 867 0
suchen, bevor Sie https://stackoverflow.com/questions/7022211/how-to-access-elements-in-a-2d-array Innen fragen Matrix Ich sehe nur eine Rückkehr, bitte lesen Sie die Python-Grundlagen noch einmal, bevor Sie in Self/__ Methoden usw. gehen oder geben Sie uns Code, Eingabe und erwartete Ausgabe in einer klaren Art und wir können Ihnen helfen. –
Ich weiß, wie man eine Eingabe von Zahlen in ein Array/Matrix umwandelt. Was ich versuche zu verstehen, ist, warum das Programm weiterhin __ str __ verwendet, anstatt __ Matrix __ zu benutzen (und alles zu tun, was darin ist). – user9098464
Weil __str__ eingebaut ist und Matrix nicht einmal aufgerufen wird? –