2017-12-14 4 views
-1

Derzeit, wenn ich x = Matrix([[5, 4], [3, 8]]) eingeben, ruft es __str__. Wie kann ich mit dieser Eingabe eine andere Methode aufrufen?Mehrere Methoden innerhalb der Klasse verwenden

class Matrix(object): 
    def __init__(self, matrix = 0): 
     self.matrix = matrix 

    def __Matrix__(self): 
     return 10 

    def __str__(self): 
     return "\\n".join(["\\t".join 
         (["%d" % k for k in row]) for row in self.matrix]) 

Wenn mein Eingang ist x = Matrix([[5, 4], [3, 8]]), wie kann ich feststellen, das Programm __Matrix__ die Methode aufzurufen? Es ruft derzeit __str__ an.

Ich habe versucht, eine Methode "Matrix" innerhalb der Klasse "Matrix" zu machen, aber das Programm hat sich nicht geändert, es verwendet die __str__ Methode.

+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. –

+0

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

+0

Weil __str__ eingebaut ist und Matrix nicht einmal aufgerufen wird? –

Antwort

1

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 
+0

Wenn Sie Python m = Matrix geben ([[1, 2, 3], [5, 4, 16], [9, 867, 0]]) und dann drucken (m), woher weiß es, zu welcher Methode? benutzen, da du ihm nur den Namen der ganzen Klasse gibst? – user9098464

+0

'print' ruft' str' auf den Objekten auf, die gedruckt werden. Dann ruft 'str' die Methode' __str__' des Objekts auf, falls sie existiert, andernfalls ruft sie '__repr__' auf. Alle Objekte sollten einen '__repr__' haben. Wenn eine Klasse nicht '__repr__' definiert, wird diejenige verwendet, die sie von ihrer Elternklasse erbt, in vielen Fällen wird dies der Standard' __repr__' sein, der in der Klasse 'object' definiert ist. –

0

können Sie nur die Funktion aufrufen

print(x.__Matrix__()) 

und es sollte funktionieren, wenn Sie das Objekt drucken es einfach die str

Verwandte Themen