2009-12-24 4 views
5

, 슈퍼 슈퍼 클래스의 슈퍼 클래스를 해결하기 위해 유형과 (결국) 인스턴스를 포장하는 클래스입니다, 지금까지 내가 본대로 다음과 같은 경우를 왜 python super는 인스턴스 만 허용하지 않습니까? 파이썬 2.X에서

class super(object) 
| super(type) -> unbound super object 
| super(type, obj) -> bound super object; requires isinstance(obj, type) 
| super(type, type2) -> bound super object; requires issubclass(type2, type) 
| Typical use to call a cooperative superclass method: 

을 받아들입니다. 예를 들어, 일반적인 사용과 함께,

  • 도 더 super(instance)이없는 이유 :

    나는 몇 가지에 의해 다소 의아해 해요 super(self).__init__(). 기술적으로 객체 자체에서 객체의 유형을 얻을 수 있으므로 현재 전략 인 super(ClassType, self).__init__()은 일종의 중복입니다. 예전 스타일의 클래스 또는 다중 상속과의 호환성 문제가 있다고 생각하지만 귀하의 요점을 듣고 싶습니다.

  • 왜 다른 한편으로는 python 3이 받아들입니다 (Understanding Python super() with __init__() methods 참조) super().__init__()? 나는 이것에 대한 어떤 종류의 마법을 본다. 암묵적인 선보다 암묵적인 것을 위반하는 것이 낫다. 나는 더 적절한 것으로 보았을 것이다 self.super().__init__().

답변

6

super(ClassType, self).__init__()는 협력 다중 상속 방식의 중복 하지입니다 - ClassType 반드시 self의 유형이 아니라, 클래스가있는 당신은 __init__에 협력 전화를하고 싶어. 당신이 C's 관점에서 수퍼 클래스 초기화를 호출 할, 당신은 B.__init__ 전화 C.__init__의 클래스 계층 구조 C inherits B inherits A에서

; B.__init__에서 B 클래스의 슈퍼 클래스 (또는 클래스 C의 B 다음에있는 mro의 다음 클래스)를 해결하려는 경우 클래스 유형 B을 super로 전달해야합니다.지금 c = C()를 인스턴스화하는 경우

class A (object): 
    def __init__(self): 
    pass 

class B (A): 
    def __init__(self): 
    super(B, self).__init__() 

class C (B): 
    def __init__(self): 
    super(C, self).__init__() 

, 당신은 클래스 유형이 중복되지 것을 볼 - super(self).__init__()B.__init__ 내부가 정말 작동하지 않을 것입니다! 여러분이하는 일은 super를 호출하는 메소드가 어떤 클래스에 수동으로 지정되어 있는지입니다 (이것은 메소드의 클래스를 가리키는 숨겨진 변수로 파이썬 3의 슈퍼에서 해결됩니다).

+0

당신은 B 클래스 (A) : 그리고 C 클래스 (B) : –

+0

을 의미한다고 생각합니다. 그러나 당신 말이 맞습니다. 메소드 B .__ init __()에서 self는 직접 슈퍼가 B가 아닌 C 타입이기 때문에 B에서 A .__ init __()을 호출 할 수 없습니다. 따라서 B .__ init __()가 다시 호출됩니다. –

+0

아, 오타에 대해 고맙습니다. 감사합니다! 그리고 이것은 다중 상속 체계에서 훨씬 더 복잡해졌습니다. 그것에 관한 링크를 찾을 수있을 것 같습니다. – u0b34a0f6ae

3

특정 답변을 드릴 수 없지만 super 키워드 주변의 PEP를 읽으셨습니까? 나는 빠른 구글 검색을했고, 그것은 PEP (367)과 파이썬의에 대한 답변을 찾을 수있는 시간의 대부분 내가 아는 다른 언어와는 달리 PEP 3135.

http://www.python.org/dev/peps/pep-0367/

http://www.python.org/dev/peps/pep-3135/#numbering-note

함께했다 명확하고 합리적인 자세 진술과 함께 PEP의 단점.

업데이트 :

가 3135을 읽어 데, 파이썬 메일 링 및 언어 관련 이메일은 그것이 파이썬 3 대 파이썬 2

http://docs.python.org/library/functions.html?highlight=super#super

방법입니다 이유는 가지 의미가 있습니다 참조

나는 슈퍼가 안전한 측면에 있고 논리를 가능한 한 간단하게 유지하도록 명시 적/중복 적으로 구현되었다고 생각합니다 (부모를 찾기 위해 설탕이나 깊은 논리가 없음). super는 내장 함수이기 때문에 파이썬 객체가 어떻게 구조화되는지에 대한 복잡함을 추가하지 않고 제공되는 것과 정확한 리턴을 추론해야합니다.

PEP 3135는 DRY의 접근 방식에 대한 논점을 제시했기 때문에 모든 것을 변경합니다.

+0

동의하지만이 증가하는 동시에 질문 _while_에 대한 답을 얻기 위해 노력하고 있어요 : 슈퍼과 다중 상속의 예제와 함께

두 링크 stackoverflow 정보. –

+0

@Stefano 원래 게시물을 만든 직후 나는 똑같은 생각을하기 시작했습니다. – David

관련 문제