2017-10-17 1 views
4
class Foo(object): 
    def whee(self): 
     return 77 

class Bar(Foo): 
    def whee(self): 
     return super(Bar, self).whee() + 1 

class Baz(Foo): 
    def whee(self): 
     return super(self.__class__, self).whee() + 1 

BarBazwhee()에 대해 동일한 결과를 반환합니다. 저는 Bar의 문법에 익숙합니다. Baz에 구문을 사용하지 않아야하는 이유가 있습니까?Python에서 super를 올바르게 사용 - 명시 적으로 클래스 이름을 참조해야합니까?

+2

이 super''에'자기 .__ class__'을 통과하지 마십시오. 그렇게 간단하다면,'super'는 처음에는 그 주장을 요구하지 않았을 것입니다. – user2357112

답변

7

Baz에 구문을 사용하지 않아야하는 이유가 있습니까?

예, 해당 구문을 사용하지 않아야하는 이유가 있습니다.Baz에서 하위 클래스를 호출하면 super() 호출이 Baz.whee()으로 다시 연결되고 무한 루프가 발생합니다. 이는 super(type(self), self).whee() 구문에도 적용됩니다.

(음, 사실 당신은 재귀 제한을 날려 아웃 오류가 발생했습니다. 그러나 어느 쪽이든 그것이 문제입니다 것입니다.)

+0

오. 죄송합니다. –

+1

... 그래서 클래스 메서드는 명시 적으로 해당 클래스를 참조하지 않는 한 선언 된 클래스에 액세스 할 수있는 방법이 없다는 것을 의미하는 것 같군요? –

+3

@JasonS : 그렇습니다. 그래서 파이썬 3은 그 정보를 담고있는 "비밀"__class__' 지역 변수를 추가해야했습니다. 그것은 zero-args'super()'가 작동하는 방법입니다. – Kevin

관련 문제