2009-07-12 1 views
7

나는 그렇게 생각하지 않는다. 그러나 나는 만일을 대비해서 내가 묻기를 바랬다. 예를 들어, int를 캡슐화하는 클래스에서 사용 :python에 변환 연산자가 있습니까?

i = IntContainer(3) 
i + 5 

그리고이 INT 예에만 관심이 아니에요, 나는 깨끗하고 일반적으로 뭔가를 찾고 모든 값 int 및 문자열 방법 오버라이드 (override)되지 않았습니다.

감사합니다. sunqiang. 그게 내가 원하는거야. 나는 당신이이 불변의 타입을 서브 클래스화할 수 있다는 것을 깨닫지 못했다. (C++에서왔다.)

class IntContainer(int): 
    def __init__(self,i): 
     #do stuff here 
     self.f = 4 

    def MultiplyBy4(self): 
     #some member function 
     self *= self.f 
     return self 

print 3+IntContainer(3).MultiplyBy4() 

답변

3

어쩌면 어쩌면 단지 int에서 직접 하위 클래스로 충분합니다. __add____radd__은 의상을 필요로하지 않습니다.

class IntContainer(int): 
    pass 
i = IntContainer(3) 
print i + 5 # 8 
print 4 + i # 7 

class StrContainer(str): 
    pass 
s = StrContainer(3) 
print s + '5' # 35 
print '4' + s # 43 
3

이것이 필요한가요?

In [1]: class IntContainer(object): 
    ...:  def __init__(self, val): 
    ...:   self.val = val 
    ...:  def __add__(self, val): 
    ...:   return self.val + val 
    ...:  def __radd__(self, val): 
    ...:   return self.val + val 
    ...: 
    ...: 

In [2]: i = IntContainer(3) 

In [3]: i + 5 
Out[3]: 8 

In [4]: 
+1

아니요. C++ 변환 연산자와 같은 것을 찾고 있었는데, 컨테이너 객체를 표현식에 포함 된 내용으로 지능적으로 대체합니다. – Alex

+0

"5 + i"로는 실패합니다. – ars

+0

ars, 당신 말이 맞아, 나는 당신의 대답을 보았고 나는 __radd__을 놓치고있다 ... 나는 나의 대답을 바꾼 후에 이제 괜찮다고 생각한다 ... –

11

이것은 당신이 무엇을해야한다 :

class IntContainer(object): 
    def __init__(self, x): 
     self.x = x 

    def __add__(self, other): 
     # do some type checking on other 
     return self.x + other 

    def __radd__(self, other): 
     # do some type checking on other 
     return self.x + other 

출력 :

당신은 다른 예 : "권리 또한"방법 "바로 뺄셈"등

여기에 같은 연산자를 포함하는 다른 링크입니다 확인할 수있는 것들 :

을 그런데 파이썬에는 캐스팅 연산자가 있습니다.

그러나 실제로는 메서드에 매개 변수에 대한 형식 주석이 없으므로 (예 : 암시 적으로 캐스트 할 수있는 좋은 방법이 없기 때문에) 사용자가 필요로하는 것을 성취하지 못합니다.

class IntContainer2(object): 
    def __init__(self, x): 
     self.x = x 

    def __int__(self): 
     return self.x 


ic = IntContainer2(3) 
print int(ic) + 6 
print 6 + int(ic) 

을하지만이 실패합니다 : 그래서 당신은이 작업을 수행 할 수 있습니다

print ic + 6 # error: no implicit coercion 
3

당신은 C처럼 변환 연산자를받지 않습니다 ++ 파이썬은 강한 정적 타입 시스템의 종류를 가지고 있지 않기 때문에. 유일한 자동 변환 연산자는 기본 숫자 값 (int/float)을 처리하는 연산자입니다. 언어로 사전 정의되어 있으며 변경할 수 없습니다.

"변환"유형은 일반적으로 생성자/팩토리에서 수행됩니다. 그런 다음 __add__과 같은 표준 메소드를 오버로드하여 다른 클래스처럼 작동하도록 할 수 있습니다.

0

8.5 세가 늦어서 죄송합니다. 불변 (즉, int)에서 파생시킬 수 있습니다. __init__을 정의 할 수 없습니다. 왜냐하면 불변이 이미 생성되어 있고 (정의에 따라) 수정할 수 없기 때문입니다. 이것은 __new__이 도움이되는 곳입니다.

class IntContainer(int): 
    def __new__ (cls, val): 
     ival = int.__new__(cls, val) 
     ival._rval = 'IntContainer(%d)' % ival 
     return ival 
    def __repr__ (self): 
     return self._rval 

In [1]: i = IntContainer(3) 

In [2]: i 
Out[2]: IntContainer(3) 

In [3]: repr(i) 
Out[3]: 'IntContainer(3)' 

In [4]: str(i) 
Out[4]: '3' 

In [5]: i + 5 
Out[5]: 8 

In [6]: 4 + i 
Out[6]: 7 

In [7]: int(i) 
Out[7]: 3 

In [8]: float(i) 
Out[8]: 3.0 

이제 변환 연산자에 대한 질문에 답변하십시오. __int__, __long__, __float__ 및 분명히 __str__을 정의 할 수도 있습니다. 임의의 객체로 변환하거나 변환하려면 원하는 것을 얻기 위해 다른 객체를 수정해야합니다. 다른 객체의 __new__ 메소드를 사용할 수 있습니다. 또는 다른 객체가 이미 생성 된 경우 __call__을 사용해보십시오.