2010-07-04 6 views
6

여기에 대해서는 의심의 여지가 있습니다. 다음 스 니펫을 고려하십시오. OOP의 패러다임 (파이썬에서)

class A(object): 
    def check(self): 
     super(A, self).check() 
     print "inside a" 

class B(object): 
    def check(self): 
     print "inside b" 

class C(A, B): 
    pass 

c = C() 
c.setup() 

지금 이것은 출력

inside b 
inside a 

제가 에 도달 A.setup() B.setup()가 호출되고 있음을 볼 PDB 통해 전달을 제공한다. 그러나 A로부터의 호출은 수퍼 클래스의 check 메소드에있다. 그것이 존재하지 않기 때문에 호출은 그 지점에서 B.check()로 이동합니다.

  1. 누군가 내부적으로 어떻게 작동하는지 설명하는 문서를 설명하거나 알려줄 수 있습니까? 나는 could'nt 무엇이라도 발견한다.
  2. 누군가 C++/Java에서 비슷한 구현을 보여줄 수 있습니까? 다른 언어와 비교해 보면 문제를 더 잘 이해할 수 있다고 생각합니다.

감사합니다.

+3

귀중한 것을 위해 귀도는 그가 파이썬의 역사에 대해 조금 알려주는 블로그를 가지고 있습니다. 최근 기사에서 그는 방법 해결 순서에 대해 이야기합니다. http://python-history.blogspot.com/2010/06/method-resolution-order.html –

답변

9

알고리즘은 this excellent article에 설명되어 있습니다. 한마디로

,

super(A,self)A 후 다음 수업 에 대한 self.__class__.__mro__에서 찾습니다.

귀하의 경우 selfc이므로 self.__class__C입니다. C.__mro__[C,A,B,object]입니다. 그래서 A 이후의 MRO의 다음 등급은 B입니다.

그래서 super(A,self)은 속성 조회와 관련하여 B처럼 동작하는 super 개체를 반환합니다.

super(A, self).check()B.check()입니다.

The C3 algorithm 파이썬이 MRO (Method Resolution Order)를 생성하는 데 사용하는 방법에 대해서는 Michele Simionato의 this essay에 자세히 설명되어 있습니다.

+0

+1 7 월 활동 중 네 번째 활동을 " 나는이 "기사를 읽는 것을 멈출 수 없다. – sdolan

+0

아, 하늘에 큰 스크린 세이버를 보는 동안 우리 가족이 파이썬 속성 조회에 대한 이야기를 들으면서 그것을 좋아합니다. – unutbu