2014-11-14 3 views
4

누구나 설명해 주실 수 있습니까? A()+A()은 오류가 발생하지만 B()+B()은 예상대로 작동합니까? 더 큰 코드를 작성할 때이 점을 보았습니다.하지만 코드를 재현하는 데 필요한 가장 작은 코드 인 것 같습니다.새 형식 클래스 연산자

from types import MethodType 

D = {'__add__': lambda x, y: "".join((repr(x), repr(y)))} 

class A(object): 
    def __getattr__(self, item): 
     if item == '__coerce__': 
      raise AttributeError() 
     return MethodType(D[item], self) 
    def __repr__(self): 
     return "A" 

class B(): 
    def __getattr__(self, item): 
     if item == '__coerce__': 
      raise AttributeError() 
     return MethodType(D[item], self) 
    def __repr__(self): 
     return "B" 

try: 
    A()+A() 
except Exception as e: 
    print e 

B()+B() 

누구에게 설명이 있습니까?

답변

5

새로운 스타일 클래스가 이진 연산자를 사용하여 __coerce__을 호출하지 않기 때문입니다. 또한 특별한 방법에 대한 __getattr__ 새로운 스타일 클래스에서 호출되지 않습니다 : 데이터 모델 coercion rules에서 :

새로운 스타일의 클래스 (그 객체에서 파생 된) 이항 연산자에 대한 응답으로 __coerce__() 방법을 호출 할 수 없습니다; __coerce__()이 호출되는 유일한 시간은 내장 함수 coerce()이 호출 될 때입니다.