2016-08-15 3 views
2

나는 문제가이 클래스에 대한 자체 기준이 코드에서 어떻게 작동하는지 이해하는 데 :파이썬 - 자체 참조 클래스 (벡터 또한 마법 연산자를 사용하여)

class Vector2D: 
    def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    def __add__(self, other): 
    return Vector2D(self.x + other.x, self.y + other.y) 

first = Vector2D(5, 7) 
second = Vector2D(3, 9) 
result = first + second 
print(result.x) 
print(result.y) 

- 그냥 있는지 확인하기를 I 마법 방법이 어떻게 작동하는지 이해하고 있는데, 에서 othersecond을 가리 킵니다.

- 편집 : 고마워, 내 생각에 other에 관한 내 혼란을 해결합니다. 나는 아직도이 줄하지만 어떻게 작동하지 않습니다 return Vector2D(self.x + other.x, self.y + other.y)이 클래스 Vector2D가 인수 other 오른쪽 second을 의미

+0

"이 줄이 어떻게 작동하는지 아직 모르겠습니다 :'return Vector2D (self.x + other.x, self.y + other.y)'"- 정확히 당신을 혼란스럽게합니까? –

+2

Python은 "new"키워드를 사용하여 클래스의 새 객체를 인스턴스화하지 않습니다. 구성은 단순히 함수 호출입니다. 따라서'Vector2D (...)'는'Vector2D' 클래스의 새로운 인스턴스의 생성입니다. 내부적으로,이 구조는'__new__' 메쏘드와'__init__' 메쏘드를 호출합니다.매개 변수는이'__init__' 메소드로 보내집니다. 클래스에 대한 튜토리얼을 읽어야한다 : https://docs.python.org/2/tutorial/classes.html –

+1

잘 설명 할 수있을 지 모르겠지만, 참고 튜토리얼은 클래스 내부에서 클래스가 호출됩니다. | 내부 클래스를 호출하여'__init__'에서 인스턴스를 생성 할 수 있습니까? – whiteredblack

답변

1

입니다. object.__add__() documentation에서

: 예를 들어

, x__add__() 방법이있는 클래스의 인스턴스 인 표현 x + y을 평가하기는 x.__add__(y)가 호출됩니다.

발현 Vector2D(self.x + other.x, self.y + other.y) 여기서 현재 인스턴스 xy 및 우측 인스턴스에 동일한 특성의 합으로 구성된다 xy 새로운 값으로 클래스의 새로운 인스턴스를 생성한다.

정상적인 의미가 + 인 경우 새 피연산자를 그대로두고 새 인스턴스를 반환하므로 새 인스턴스가 만들어집니다. 이것을 두 개의 목록을 합치는 것과 비교하십시오 (['foo', 'bar'] + ['bar', 'baz']); 거기도 새로운 목록 개체가 반환됩니다.

1

그 안에 참조되는 즉?

수정. 그래서

result = first.__add__(second) 

:

class Vector2D: 
    def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    def __add__(self, other): 
     print(other.x, other.y) 
     return Vector2D(self.x + other.x, self.y + other.y) 

first = Vector2D(5, 7) 
second = Vector2D(3, 9) 
result = first + second 

>> 3 9 
3

예,이하는 것과 같습니다

  1. selffirst
  2. other입니다 second
  3. 입니다 당신은 print __add__ 안에 함께 것을 확인할 수 있습니다
  4. result 예, other가 오른쪽 측면 발현 결과, 귀하의 경우 second있는 새로운 Vector2D