2012-06-18 4 views
3

클래스 정의와 사용법에 대한 일반적인 질문이 있습니다.이 코드 중 하나는 잘 작동하지만 일반적인 질문이 있습니다.Python 클래스 - 설명이 필요합니다.

여기서 Point 클래스를 정의하고 Point1이라는 두 인스턴스를 만듭니다. Point1 & Point2. point2에 대한 거리를 계산할 때 point1 객체를 어떻게 전달할 수 있습니까?

포인트 객체는 point 객체가 아니고 other_point는 변수로 상주합니다.

조금 혼란스러워.

코드 :

import math 
class Point: 
    def move(self, x, y): 
     self.x = x 
     self.y = y 
    def reset(self): 
     self.move(0, 0) 
    def calculate_distance(self, other_point): 
     print("Inside calculating distance") 

     return math.sqrt(
       (self.x - other_point.x)**2 + 
       (self.y - other_point.y)**2) 

point1 = Point() 
point2 = Point() 
point1.reset() 
point2.move(5,0) 
print(point2.calculate_distance(point1))      
+0

이 사이트는 멘토링을위한 것이 아닙니다. Python 클래스, 객체 및 메소드에 대한 자습서를 읽으십시오. – Marcin

+8

앗! 이것은 프로그래밍 포럼이며,이 사람은 파이썬에 매우 새로운 것으로 보입니다. 또한 멘토링 스타일 질문이 SO에 대해 처음으로 제기 된 것은 아닙니다. – inspectorG4dget

+0

@ inspectorG4dget 첫 번째도 아니고 마지막 시간도 아니지만 나는 그들을 낙담시키는 것이 옳다고 생각합니다. – Marcin

답변

2

이것이 바로 self 변수가 있습니다. 따라서 클래스의 정의 안에 있으면 self을 사용하여 데이터를 조작하려는 객체를 식별 할 수 있습니다.

예를 들어 human이라는 클래스 (age이라는 멤버 변수가 있음)가 있다고 가정하고 매년 increment_age 함수를 호출하여 해당 사람의 나이를 늘리고 싶다고 가정 해보십시오.당신은 개체 자체를 참조하는 self 호출하여

class Human: 
    def __init__(self): 
     self.age = 0 

    def increment_age(self): 
     self.age += 1 

>>> h = Human() 
>>> print h.age 
0 
>>> h.increment_age() 
>>> print h.age 
1 

그래서 당신이 볼, 그런 다음, 다음과 같은 코드를 작성할 수 있습니다. 귀하의 예에서는 point1을 참조하면 self이됩니다.

이제 Human 클래스에서 두 사람이 싸울 수있는 함수를 추가한다고 가정합니다. 이 경우 한 사람이 다른 사람과 싸워야합니다 (다른 사람과 싸우면 한 사람 씩 생명력을 높이고 다른 사람의 삶은 한 사람 씩 줄임). 이 경우, 당신은 Human 클래스 내에서 다음과 같은 기능을 쓸 수있다 : 이제

def fight(self, other_human): 
    self.age += 1 
    other_human.age -= 1 

:

>>> h1 = Human() 
>>> h2 = Human() 
>>> h1.age = 5 
>>> h2.age = 3 
>>> print h1.age 
5 
>>> print h2.age 
3 
>>> h1.fight(h2) 
>>> print h1.age 
6 
>>> print h2.age 
2 

은 따라서 당신이 h2fight 함수의 other_human 것을이 예에서 볼 수 있습니다.

희망하는 사람

1

는 코드, selfpoint2에 의해 참조되는 객체 point2.calculate_distance(point1) 전화 calculate_distance을 감안할 때, 그리고 개체가 other_pointpoint1에 의해 참조.

이런 종류의 것들을 배우는 좋은 방법은 시각적 인 디버거를 사용하고 호출이 이루어질 때 스택 프레임의 값을 검사하는 것입니다.

0

calculate_distance의 내부에있는 other_point은 어떤 객체가 인수로 전달되는지를 나타내는 데 사용되는 이름입니다.

5

Point 개체를 만들 때 여러 가지 일이 발생합니다. 일어나는 일들

point1 = Point() 
point2 = Point() 

하나는 Point 클래스에 속하는 어떤 방법 바인딩 있다는 것입니다. 즉, 메서드의 인수 중 하나가 으로 고정되어으로 고정되어 있으므로 항상 생성 된 인스턴스를 참조합니다. calculate_distance의 정의를 살펴 보겠습니다.

def calculate_distance(self, other_point): 
    print("Inside calculating distance") 

    return math.sqrt(
      (self.x - other_point.x)**2 + 
      (self.y - other_point.y)**2) 

아마도 어떤 인수가 수정되었는지 추측 할 수 있습니다. Point()이 호출되고 인스턴스가 만들어지면 매개 변수 calculate_distnace은 항상 해당 인스턴스를 참조하도록 고정되어 있습니다. 당신은이에 해당하고있는

point1.calculate_distance(x) 

: 그래서 당신은이 작업을 수행 할 때마다

Point.calculate_distance(point1, x) 

을 그리고 당신이 할 때마다이 :

point2.calculate_distance(point1) 

당신이에 해당하고 있어요 :

Point.calculate_distance(point2, point1) 
관련 문제