클래스 내의 파이썬 호출 함수


242

두 좌표 사이의 거리를 계산하는이 코드가 있습니다. 두 함수는 모두 같은 클래스 내에 있습니다.

그러나 함수 distToPoint에서 함수 를 어떻게 호출 isNear합니까?

class Coordinates:
    def distToPoint(self, p):
        """
        Use pythagoras to find distance
        (a^2 = b^2 + c^2)
        """
        ...

    def isNear(self, p):
        distToPoint(self, p)
        ...

41
try : self.distToPoint (p)
momeara

isNear와 distToPoint가 다른 인수를 취하는 경우 어떻게됩니까? 그렇다면 클래스 내부에있는 distToPoint를 어떻게 호출 할 수 있습니까? 누구든지 저에게 설명 할 수 있습니다.
Raghavendra Gupta

답변:


394

이들은 멤버 함수이므로 인스턴스에서 멤버 함수로 호출하십시오 self.

def isNear(self, p):
    self.distToPoint(p)
    ...

2
그러나 self.foo ()는 다른 클래스의 함수로 해석 될 수있는 메소드 분석 순서를 사용합니다.
Francis Davey

우리가 자기를 사용하지 않으면 어떻게됩니까? distToPoint (p)를 직접 호출 하시겠습니까?
Marlon Abeykoon

3
@Marlon Abeykoon "자기"논쟁이 사라질 것입니다
Pitipaty

1
isNear와 distToPoint가 다른 인수를 취하는 경우 어떻게됩니까? 그렇다면 클래스 내부에있는 distToPoint를 어떻게 호출 할 수 있습니까? 누구든지 저에게 설명 할 수 있습니다.
Raghavendra Gupta

46

distToPoint클래스 내부에 있기 때문에 작동하지 않으므로 다음과 같이 클래스 이름을 참조하려면 클래스 이름을 접두어로 사용해야합니다 classname.distToPoint(self, p). 그래도 그렇게해서는 안됩니다. 더 좋은 방법은 다음과 같이 클래스 인스턴스 (클래스 메소드의 첫 번째 인수)를 통해 메소드를 직접 참조하는 것입니다 self.distToPoint(p).


@Aleski. 그것이 일반적인 방법이라면 (모든 인스턴스에 공통적이고 메소드에서 참조되는 인스턴스 특정 변수가없는 경우) 왜 classname.distToPoint (self, p)를 사용해서는 안됩니까?
Yugmorf

2
@Yugmorf는 하나가 사용해야 하나의 상황에있어 classname.distToPoint(self, p)재정의하는 서브 클래스 정의 할 때 : distToPoint하지만, 필요 원본을 호출합니다. 이 경우 self.distToPoint(p)정상적으로 호출하려고 하면 방금 정의 한 메소드를 호출하고 무한 재귀에 빠지게됩니다. 클래스 내부가 아닌 경우, classname.distToPoint(obj, p)대신에 사용 하는 상황이 하나뿐입니다 obj.distToPoint(p). obj가 서브 클래스의 인스턴스 일 수 있지만 원래 distToPoint정의 된 (계속)
Aleksi Torhamo

1
에서 classname그러나 이것은 매우 해키이며없이 일반적으로 수행 할 수없는 것을 참고 - 대신 오버라이드 (override) 서브 클래스의 버전의 매우 좋은 이유. 당신이 클래스를 통해 명시 적으로 메소드를 호출 할 때 서브 타입 다형성을 중단합니다 (위의 예 모두에서, 당신은 특별히 원하는 것을 할). 간단히 말해서 , 어떤 좋은 이유 때문에 하위 유형 다형성을 우회 해야 할 때 클래스를 통해 메소드를 명시 적으로 호출 해야 합니다. 이 방법을 재정의하지 않은 경우 두 가지 방법은 동일하지만 self.distToPoint(p)더 짧고 읽기
쉽습니다

그래서 당신은 여전히 ​​그것을 사용해야합니다. 이제 질문의 세부 사항에 도달하십시오. 메서드가 인스턴스 변수를 사용하지 않으면 대신 클래스 메소드이어야합니까? @classmethod메소드 앞에 추가하여 추가 하고 인스턴스 ( self)를 더 이상 첫 번째 인수로 얻지 않고 대신 클래스를 얻으므로 첫 번째 인수의 이름을 예를 들어 지정해야합니다. cls대신에. 그 후, 당신은 같은 중 하나 classmethod를 호출 할 수 있습니다 obj.distToPoint(p)또는 classname.distToPoint(p)(의 부족주의 obj). 당신은해야 여전히 아마 사용 (계속)
ALEKSI Torhamo

obj.distToPoint(p)그러나 클래스 메소드가 일반적으로 서브 클래스에서 재정의 될 수 있기 때문에 하위 유형 다형성을 우회 해야하는 좋은 이유가 없다면 다시 손에 관련 인스턴스가 있다면. 물론 사용 가능한 관련 인스턴스 가없는 경우 클래스를 통해 클래스 메서드를 직접 호출해야합니다 .
Aleksi Torhamo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.