Ich habe noch nie umgekehrte Operatoren behandelt, also bitte nicht flammend! Habe gerade erst angefangen über sie zu lernen und wollte sie ausprobieren. Aber aus irgendeinem Grund funktioniert es nicht. Hier ist der Code:
%Vor% Wenn ich __rsub__
in __sub__
ändere, funktioniert es.
Was mache ich falsch? Was ist auch der Zweck dieser Reverse-Operatoren?
__rsub__()
wird nur aufgerufen, wenn die Operanden unterschiedlich sind; wenn sie vom selben Typ sind, wird angenommen, dass, wenn __sub__
nicht vorhanden ist, sie nicht subtrahiert werden können.
Beachten Sie auch, dass Ihre Logik in jedem Fall umgekehrt ist; du bist selbst zurückkehrend - anders als anders - selbst
Der Sinn dieser Methoden ist es, dies zu ermöglichen:
%Vor% Sehr selten nützlich, normalerweise benutzt man nur Dinge des gleichen Typs und die direkte __sub__
Aus Pythons Datenmodell unter Ссылка :
Diese Methoden werden zur Implementierung aufgerufen die binären arithmetischen Operationen (+, -, *, /,%, divmod (), pow (), **, & lt; & lt ;, & gt; & gt ;, & amp ;; ^, |) mit reflektierten (getauschten) Operanden. Diese Funktionen sind nur wenn der linke Operand nicht aufgerufen wird unterstütze die entsprechende Operation und die Operanden sind unterschiedlich Arten. [2] Zum Beispiel, um zu bewerten der Ausdruck x - y, wobei y ein ist Instanz einer Klasse mit einem
__rsub__()
method,y.__rsub__(x)
wird aufgerufen, wennx.__sub__(y)
zurückgibt NotImplemented.
Allerdings müssen beide Objekte nicht dieselbe Klasse haben - das heißt, selbst wenn Sie eine __sub__
-Methode setzen, die NotImplemented in Ihrem obigen Beispiel zurückgibt, erhalten Sie immer noch denselben Fehler: Python geht davon aus, dass Ihre Subtract-Klasse dies kann 'subtrahieren von "Subtrahieren" -Objekte, egal in welcher Reihenfolge.
Das funktioniert jedoch:
%Vor%Die Methoden mit reflektierten Operanden sind vorausgesetzt, dass Ihre Klasse einen Operator implementieren kann, wenn der linke Operand ein primitives Element oder etwas anderes ist, das nicht unter Ihrer Kontrolle steht:
Diese Funktionen werden nur aufgerufen, wenn der linke Operand die entsprechende Operation nicht unterstützt und die Operanden unterschiedlich sind.
Da beide vom selben Typ sind, lehnt es dies feige ab und Sie sollten die Methode __sub__
implementieren.