2013-04-09 3 views
14

는 고려 : 파이썬 2.7에서파이썬 슈퍼() 상속과 필요한 인수

class Parent(object): 

    def altered(self): 
     print "PARENT altered()" 

class Child(Parent): 

    def altered(self): 
     print "CHILD, BEFORE PARENT altered()" 
     super(Child, self).altered() # what are the arguments needed? Why Child and self? 
     print "CHILD, AFTER PARENT altered()" 

는 왜 Childsuper() 호출에 인수로 전달해야합니까? super를 사용하는 것의 정확한 복잡성은 단지 그것을 작동시키는 대신에 무엇입니까?

+7

내가 아는 한, 그것은 MRO와 관련이 있습니다. 그러나 나는 "진짜"대답을 설명하기에 충분하지가 않다. 이것은 아마도 도움이 될 것입니다. http://rhettinger.wordpress.com/2011/05/26/super-considered-super/ 인수는 파이썬 3에서는 더 이상 필요하지 않습니다. –

+0

그래서 첫 번째 인수는 "Child"입니다. 학부모가 기본이기 때문에 상속 받고 싶은 수업이 아니라 수업에 들어 있습니까? 내가 생각하는 것 같은 것. 또한 읽어 주셔서 감사 드리며 Python 2.7을 사용하고 있습니다. super()에 대해 계속 읽으십시오 –

답변

18

super 숫자는 메소드 확인 순서의 다음 클래스입니다. 당신이 전달하는 두 가지 인수는 그것을 알아낼 수있는 것입니다 - self은 속성을 통해 전체 MRO를 제공합니다. 현재 클래스는 MRO 의 현재 위치를 알려줍니다.. 그래서 슈퍼 실제로하는 일은 기본적으로 :

def super(cls, inst): 
    mro = inst.__class__.mro() # Always the most derived class 
    return mro[mro.index(cls) + 1] 

그것이 이유 슈퍼 데의 전체 포인트는 밖으로 작동하는 기능을 가지고 있기 때문에 현재의 클래스는 기본 클래스 오히려입니다 기본 클래스입니다보다는 무엇을 명시 적으로 참조하는 것보다 - 기본 클래스의 이름이 변경되면 문제가 발생할 수 있습니다. 부모 클래스가 호출되는 것을 정확히 모르는 경우 (특히 새 클래스를 삭제하는 namedtuple과 같은 공장 기능을 생각하는 경우) 특히 다중 상속 상황 (MRO의 다음 클래스가 현재 클래스의베이스 중 하나가 아닐 수도 있음)에서.

+0

기본 클래스가 아닌 현재 클래스 인 이유는 수퍼 유저가 갖는 전체 요점이 명시 적으로 참조하지 않아도되는 기본 클래스가 작동하는 함수를 갖기 때문입니다 . 네가 말한 라인이 멋지게 요약 된 것 같아. MRO를 살펴보고 이것이 파이썬 2.x의 단점이라는 것을 깨닫게 될 것입니다. 왜냐하면 파이썬 3은 이러한 인수를 필요로하지 않기 때문입니다. 고맙습니다. –

+3

@klandshome 파이썬 3의 수퍼 워크는 똑같은 방식으로 작동합니다. 대부분의 상황에서 (호출 스택을 검사하여) 인수를 전달하지 않고 인수 자체를 파악할 수있는 재미있는 기능이 있습니다. – lvc

+1

흠. 훌륭한 정보. 호출 스택. 나는 많은 것을 배웠다. 고맙습니다. –