2016-06-21 4 views
-2

python에서 상속 된 클래스의 생성자를 호출하는 올바른 방법은 무엇입니까? 예를 들어 상속 된 클래스 python에서 생성자가 실패했습니다

,

class A: 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 


class B(A): 

    def __init__(self, x, y, z): 
     self.z = z 
     # super().__init__(x, y) # <== works 
     super(x, y) # <== throws TypeError: must be type, not int 

a = A(2, 3) 
b = B(2, 3, 4) 

는베이스 클래스로부터의 __init __() 메소드를 호출없이 생성자를 호출 할 수 있습니까?

+3

'super()'문서를주의 깊게 읽었습니까? –

답변

3

을; 현재 클래스와 self 전달 객체를 생성 할 필요가, 그 다음에 상속 된 속성을 참조 :

super(B, self).__init__(x, y) 

super() 다음에서 시작하는 방법 해상도 ​​주문 (MRO)으로 전체 상속 트리를 검색 type(self).__mro__를 사용 다음 위치를 지난 B, 원하는 속성을 찾으십시오. 여기에서 __init__을 찾으므로 type(B).__mro__이 먼저 B으로 검색된 다음 __init__ 속성에 대해 다음 항목에서 시작하여 self에 바인딩됩니다. 이렇게하면 A.__init__(self, x, y) 번으로 전화가 연결됩니다.

이 MRO에서 상속 된 특성을 찾는데 사용할 수 있지만 현재 방법의 기본 구현을 찾는 것만으로 유용하지는 않습니다.

super()는 파이썬이 의미 새로운 스타일의 클래스을 사용할 수 있습니다

당신은 object으로 상속 트리를 시작해야합니다 :

class A(object): 

object 자동으로 파이썬에서 상속 트리의 일부입니다 3.

+0

그래서 첫 번째 인수는 기본 클래스이고 두 번째 인수는 현재 객체에 대한 참조이며 실제 생성자 호출입니다. – Sebi

+1

@Sebi : 첫 번째 인수는 기본 클래스가 아닌 * 현재 * 클래스입니다. 현재 클래스가 전체 상속 계층을 결정하므로 메서드 확인 순서가 결정되므로 이는 중요합니다. 'super()'는 MRO에서 * 속성 *을 찾기 위해 프록시 역할을하지만, 현재의 메소드에는 유용하지 않습니다. –

+0

예외 "TypeError : classobj가 아닌 형식이어야합니다." – Sebi

2

이 작업을 수행합니다 : 당신은 super() 잘못을 사용하는

super(B, self).__init__(x, y) 
관련 문제