2016-09-28 2 views
-2

두 개의 부모로부터 속성과 메소드를 상속받은 클래스를 만들고 싶습니다. 하자는 다음 나는 두 가지 방법을 모두 상속과 그 부모로부터 속성을 하위 클래스 C를 생성하는 방법을 잘 모르겠습니다 두 부모 클래스Python : 다중 상속의 메소드 및 속성 공유

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def method_a(self): 
     return self.a + 10 


class B(object): 
    def __init__(self, b): 
     self.b = b 

    def method_b(self): 
     return self.b + 20 

을 말할. 어떻게 설정하는

class C(A, B): 
    def __init__(self, a, b): 
     A.__init__(self, a=a) 
     B.__init__(self, b=b) 

다음 내가 문제없이이 작업을 수행 할 수 있습니다 ...

my_class = C(a=1, b=2) 
print(my_class.a) 
print(my_class.b) 
print(my_class.method_a()) 
print(my_class.method_b()) 

모르겠다을 나는 같은 것을 할 수 있지만, 나는이없는 매우 파이썬입니다 확신합니다 super 부모님의 메서드와 특성을 상속하려면 도움이 필요합니다. 그런데 : 클래스 A와 클래스 B는 서로 의존해서는 안됩니다.

+0

이러한 정보는 빠른 Google 검색으로 쉽게 찾을 수 있습니다. – techydesigner

답변

0

내가 아는 한, super의 작동 방식은 서브 클래스의 시작 부분에 선언 된 수퍼 클래스 목록을 기반으로 mro (메서드 확인 순서) 목록이 완성됩니다. supper (Python 3)을 호출하면 mro 목록에있는 첫 번째 클래스의 __init__이 호출됩니다. 그 __init__도 또 다른 super()을 포함 할 것으로 예상되어 mro의 다음 클래스의 __init__도 호출됩니다.

귀하의 경우 mro 목록은 [A, B]이어야합니다. 따라서 __init__A 일 때 __init__B이 호출되도록 super의 호출을 포함해야합니다. 여기

문제는 다음과 같습니다

  • 당신은 서로 의존하지 AB를 원한다. super을 사용하려면 mro 목록이 필요합니다. 위에서 설명한대로이 요구 사항을 충족하지 못합니다. AB의 사람들 만 1. 당신은 A-a을 통과 할 수 있습니다 가지고 있지만 Bb을 통과 할 수있는 방법이 있는지 모르겠어요 동안 C
  • __init__ 2 개 매개 변수가 있습니다.

그래서 나는이 상황에서 super을 도울 수 없다고 생각합니다.

+0

안녕하세요. 귀하의 답변에 감사드립니다. 난 원래의 게시물에 위에서 정의 된대로 명시 적 생성자 호출을 떠났어. 멋지게 작동하는 것 같습니다! – HansSnah

관련 문제