2016-09-15 4 views
1

나는 다음과 같은 방법으로 파이썬에서 간단한 연산자 오버로딩을 할 수 있다는 것을 알고있다.여러 피연산자로 파이썬 연산자 오버로드

'+'연산자를 오버로드한다고합시다.

class A(object): 
    def __init__(self,value): 
    self.value = value 

    def __add__(self,other): 
    return self.value + other.value 

a1 = A(10) 
a2 = A(20) 
print a1 + a2 

하지만 다음을 수행하려고 할 때 그것은 실패

a1 = A(10) 
a2 = A(20) 
a3 = A(30) 
print a1 + a2 + a3 

__add__ 만이 매개 변수를 사용할 수 있기 때문에. n 개의 피연산자로 연산자 오버로딩을 수행하는 최상의 솔루션은 무엇입니까?

답변

2

a1 + a2int 인스턴스를 반환하고 해당 __add__이 호출되어 사용자 지정 클래스 A의 추가를 지원하지 않으므로 실패했습니다.

class A(object): 
    def __init__(self,value): 
    self.value = value 

    def __add__(self,other): 
    return type(self)(self.value + other.value) 

지금 함께 추가 예상되는 방식으로 동작 :

>>> a1 = A(10) 
>>> a2 = A(20) 
>>> a3 = A(30) 
>>> print(a1 + a2 + a3) 
<__main__.A object at 0x7f2acd7d25c0> 
>>> print((a1 + a2 + a3).value) 
60 

물론이 클래스는 같은 문제를 앓고 당신이 특정 작업에 대한 예외를 제거하기 위해 __add__A 인스턴스를 반환 할 수 다른 작업; 다른 인스턴스를 구현하여 클래스의 인스턴스를 반환해야합니다. 그렇지 않으면 다른 작업에서 동일한 결과가 발생합니다.

class A(object): 
    def __init__(self,value): 
     self.value = value 

    def __add__(self,other): 
     return A(self.value + other.value) 

    def __str__(self): 
     return "{}".format(self.value) 

지금 인쇄 효과는 당신이 필요로했다 : 당신이 원하는 경우

좋은 결과라고 할 때 print 이러한 개체, 당신은 또한 값을 반환 __str__를 구현해야 할 때 표시

>>> print(a1 + a2 + a3) 
60 
+1

왜 _temporarily_로 요약하는 방법을 몰라? 나에게 맞는 해결책 인 것 같아. –

+0

일시적으로 잘못된 단어 일 수 있습니다. 요점은 특정 작업에 대한 문제를 해결하지만 모든 필수 작업을 구현하지 않으면 일반적으로 이상한 결과가 발생합니다. –

+0

고맙습니다.하지만 값을 외부 적으로 사용하지 않고 a1 + a2 + a3을주는 것으로 결과를 얻고 싶습니다. –

0

문제는입니다.

a1 + a2 + a3 은입니다. 30 + a3

(30) (10)는 int이며와의 int 당신은 당신의 __add__ 기능의 인스턴스를 반환해야