2012-04-08 2 views
1

나는 WTForms에서 상속과 함께 일하고있었습니다. 나는 다음 수업이 있었다 :self .__ class__가 잘못된 클래스 상속입니까?

class MyForm(WTForms): 
    ... 
    def process(self, formdata=formdata, obj=None): 
     super(self.__class__, self).process(formdata=formdata, obj=obj) 

을 그리고 오류가 발생했습니다 (항상 있지만, 유사한 형태의 경우에 - 그것은 더 이상하다) :

Maximum recursion depth have been exceeded

을하지만했습니다 때 변경된 self.__class__MyForm 모든 것이 OK였습니다!

나는 그것을 얻지 않는다 ... 나는 그들이 동의어 여야한다는 것을 알고있다. 뭐가 문제 야?

답변

5

동의어가 아닙니다. self이 상속하는 클래스의 객체 일 수 있습니다.MyForm. 파이썬은 상속 된 메소드를 호출하기위한 새로운 수퍼 클래스 객체를 자동으로 생성하지 않고 단지 같은 객체를 전달하기 때문에 다형성을 깨뜨리고 아무 쓸모가 없습니다. 그리고 type()/.__class__은 분명히 객체가 실제로 그 인스턴스의 일부 클래스가 아닙니다. (이 object이 될 것으로 예상하지 않습니까?) __class__이 어디에서 액세스했는지에 따라 달라지면 정말 놀랍고 비 관용적이며 쓸모가 없습니다. 그것은 단지 다형성입니다. , self.__class__를 통과 항상 self가 어떤 클래스의 (즉시) 슈퍼 클래스에서 다시 시작합니다

그리고 super에 첫 번째 인수가 (당신이 현재 비공식적으로)을 MRO에 supermethod에 대한 검색을 계속해야 지표이기 때문에

의 인스턴스 적절한 super이 클래스 계층의 다른 곳에서 호출된다면 궁극적으로는 MyForm.process으로 돌아오고 무한 루프가 발생합니다.

+0

우수 설명. –