Automatische Typumwandlungen von benutzerdefinierten Klassen

8

Ich möchte also eine Klasse erstellen, die einen int umschließt und einige Dinge zulässt, die normalerweise nicht mit int-Typen möglich sind. Es ist mir egal, ob es nicht pythonisch oder w / e ist Ich suche nur nach Ergebnissen. Hier ist mein Code:

%Vor%

Die Ausgabe war.

%Vor%

Also, die erste Druckanweisung lief gut und gab, was ich erwartet hatte, aber die zweite gab einen Fehler aus. Ich denke, das liegt daran, dass die erste die add -Funktion von tInt verwendet, weil eine vor + "5" erschien und die zweite die Funktion add der Zeichenkette "5" verwendete weil es zuerst erschien. Ich weiß das, aber ich weiß nicht wirklich, wie man entweder eine add -Funktion erzwingt oder die tInt-Klasse als string / int / etc .. darstellen kann, wenn ein normaler Typ davor in einem erscheint Operation.

    
tatatat0 20.04.2016, 13:36
quelle

1 Antwort

13

Sie müssen eine __radd__ -Methode implementieren, um den Fall zu behandeln, wenn sich eine Instanz Ihrer Klasse auf der rechten Seite des Zusatzes befindet.

Die Dokumente sagen:

  

Diese Methoden werden aufgerufen, um die binären arithmetischen Operationen zu implementieren   (+, -, *, @, /, //,%, divmod (), pow (), **, & lt; & lt ;, & gt; & gt ;, & amp;; ^, |) mit   reflektierte (getauschte) Operanden. Diese Funktionen werden nur aufgerufen, wenn der   linker Operand unterstützt nicht die entsprechende Operation und die   Operanden sind von verschiedenen Arten. 2 Zum Beispiel, um die   Ausdruck x - y, wobei y eine Instanz einer Klasse ist, die ein    rsub () Methode, y. rsub (x) wird aufgerufen, wenn x. sub (y) NotImplemented zurückgibt.

Beispiel:

%Vor%

Wie @chepner in den Kommentaren darauf hingewiesen hat, NotImplemented für Fälle zurückzugeben Wenn Ihre Methode nicht funktioniert, führt Python andere Möglichkeiten zur Ausführung der Operation aus oder löst einen TypeError aus, wenn die angeforderte Operation nicht ausgeführt werden kann.

    
snakecharmerb 20.04.2016, 13:43
quelle

Tags und Links