Verwenden von umgekehrten Operatoren in Python

8

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?

    
Randy 21.09.2010, 19:21
quelle

4 Antworten

4

__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

    
geoffspear 21.09.2010 19:30
quelle
3

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__

    
Jochen Ritzel 21.09.2010 19:48
quelle
3

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, wenn x.__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%     
jsbueno 21.09.2010 19:36
quelle
2

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.

    
Josh Lee 21.09.2010 19:30
quelle

Tags und Links