2016-07-27 4 views
5

float 값의 정수 값을 추가로 다른 행동, 내가 플로트로 불려 갔을 경우 __add__ 방법은 이와 같은, 잘 작동하고 있음을 깨달았다파이썬 : __add__ 및 +, 부동 소수점 및 정수

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

하지만, 정수에 호출되지 않은 경우 :

>>> m.__add__(n) 
NotImplemented 

은 처음에는 __add__ 그냥 intfloat 유형 다르게 구현 (유형을 int로 추가 할 수 받아들이는 플로트 타입 같은, 그러나 반대하지 않음)되었다는 생각했다. 그렇다면 + 연산자를 사용하면 모든 것이 잘 작동하는 것으로 나타났습니다.

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

왜 이런 일이 일어나는 지 알고 계십니까? __add__+은 서로 깊이 관련이 있습니까?

+0

'm .__ radd __ (n)'에 대해서도'NotImplemented'가 리턴되었습니다. –

+0

@ this-vidor : 잘못된'__radd__' 메소드가 있습니다. – user2357112

+0

@ user2357112 사실! 그러면 그것은 해결책입니다. –

답변

6

a + ba.__add__(b)으로 직접 변환되지 않습니다. a.__add__이없는 경우 b.__radd__(a)을 시도하거나 NotImplemented을 반환하거나 ba 유형의 하위 유형 인 경우를 반환합니다.

+0

나는 아직도 혼란 스럽다. * anInt .__ add __ (aFloat) * == * NotImplemented *하지만 * aFloat .__ add __ (anInt) *의 동작을 설명하는 방법은 float sum을 생성합니까? 나는 + /'__add__' 둘 다 교환 가능하다고 생각할 것입니까? – RBV

+1

@RBV :'+'도 아니고'__add__'도 교환 가능합니다. '+ '는 교환 할 수있는 경우에도 교환 할 수 없다. 왜냐하면'+'는'[1] + [2]! = [2] + [1]'과 같은 경우가 교환 적이 지 않기 때문이다. 인수는 조작을 처리하는 f}을 알아야합니다. – user2357112

관련 문제