2016-07-27 8 views
5

Wenn Sie einen ganzzahligen Wert auf einen Float-Wert hinzufügen, erkannte ich, dass __add__ Methode funktioniert prima, wenn auf Schwimmer genannt, wie folgt aus:Python: __add__ und +, unterschiedliches Verhalten mit Schwimmer und integer

>>> n = 2.0 
>>> m = 1 
>>> n.__add__(m) 
3.0 

aber wenn nicht auf eine ganze Zahl genannt:

>>> m.__add__(n) 
NotImplemented 

zuerst dachte ich, dass __add__ wurde nur anders umgesetzt für int und float Typen (wie float-Typen zu akzeptieren hinzugefügt werden Typen int, aber nicht das Gegenteil). Dann habe ich gemerkt, dass alles gut funktioniert, wenn ich den + Operator benutze:

>>> n + m 
3.0 
>>> m + n 
3.0 

Weiß jemand, warum das passiert? Sind __add__ und + nicht tief miteinander verwandt?

+0

'NotImplemented' auch für' m .__ zurück radd __ (n) ' –

+0

@ this-vidor: Falsche' __radd__' dort Methode. – user2357112

+0

@ user2357112 Wahr! Dann ist das die Lösung. –

Antwort

6

a + b übersetzt nicht direkt an a.__add__(b). Er versucht auch b.__radd__(a) wenn a.__add__ nicht existiert oder gibt NotImplemented, oder wenn b ist eine Instanz eines Subtyps von a ‚s-Typ.

+0

Ich bin immer noch verwirrt. Wie erklärt dies das Verhalten von * anInt .__ add __ (aFloat) * == * NotImplemented * aber * aFloat .__ add __ (anInt) * erzeugt eine Float-Summe? Ich würde denken, +/'__add__' wäre beides kommutativ? – RBV

+1

@RBV: Weder '+' noch '__add__' sind kommutativ. '+' ist nicht kommutativ wegen Fällen wie '[1] + [2]! = [2] + [1]', und '__add__' ist nicht kommutativ, auch nicht für Fälle, in denen' + 'kommutativ ist, weil nur eins Argument muss wissen, wie mit der Operation umzugehen ist. – user2357112

Verwandte Themen