überladen arithmetische Zuweisungen in Python

7

Ich bin neu bei Python, also Entschuldigung im Voraus, wenn das eine dumme Frage ist.

Für eine Zuweisung muss ich erweiterte arithmetische Zuweisungen (+ =, - =, / =, * =, ** =,% =) für eine Klasse myInt überladen. Ich habe die Python-Dokumentation überprüft und das ist, was ich herausgefunden habe:

%Vor%

self.a und other.a verweisen auf den in jeder Klasseninstanz gespeicherten int. Ich habe versucht, dies wie folgt zu testen, aber jedes Mal, wenn ich "None" anstelle des erwarteten Werts 5:

%Vor%

Kann mir jemand sagen, warum das passiert? Vielen Dank im Voraus.

    
Mel 15.02.2010, 16:46
quelle

3 Antworten

14

Sie müssen return self zu Ihrer Methode hinzufügen. Erklärung:

Die Semantik von a += b , wenn type(a) eine spezielle Methode __iadd__ hat, wird wie folgt definiert:

%Vor%

Wenn also __iadd__ etwas anderes als self zurückgibt, wird das nach dem Vorgang an den Namen a gebunden. Wenn eine return -Anweisung fehlt, entspricht die von Ihnen gepostete Methode einer mit return None .

    
Alex Martelli 15.02.2010, 16:50
quelle
7

Erweiterte Operatoren in Python müssen den letzten Wert zurückgeben, der dem Namen zugewiesen wird, an dem sie aufgerufen werden, normalerweise (und in Ihrem Fall) self . Wie bei allen Python-Methoden wird bei einer fehlenden return-Anweisung None zurückgegeben.

Auch

  • Erhöhe nie Exception , was unmöglich vernünftig zu fassen ist. Der Code dazu müsste except Exception sagen, was alle Ausnahmen abfangen würde. In diesem Fall möchten Sie ValueError oder TypeError .
  • Tippen Sie nicht auf type(foo) == SomeType . In diesen (und praktisch allen) Fällen funktioniert isinstance besser oder zumindest gleich.
  • Immer wenn Sie Ihren eigenen Typ wie myInt erstellen, sollten Sie ihn mit Großbuchstaben benennen, damit die Leute ihn als Klassennamen erkennen können.
Mike Graham 15.02.2010 17:17
quelle
1

Ja, Sie brauchen "Selbst zurückgeben", es sieht so aus:

%Vor%     
woo 15.02.2010 16:52
quelle