0

, 나는 상속 관계 B -> C -> D 있고, 특정 기능 여기에 관심python 다중 상속에서 한 부모가 그 부모가 무엇인지 모른 채 다른 부모에게 액세스 할 수 있습니까? 내 코드에서

class C(B): 
    def f(self): 
     if <some condition>: 
      B.f(self) 
     else: 
      <do other stuff> 

f가 그리고 문제는 현실에서 B의 여러 가능성이 있다는 것입니다,하지만 C의 논리는 똑같다. 직선적 인 방법은 선형 상속을 여러 번 사용하는 것입니다. 즉,

B1 -> C1 -> D1 
B2 -> C2 -> D2 
B3 -> C3 -> D3 

그러나 낭비입니다. 그럼 난 다중 상속을 사용하여 생각하고

D1(C, B1) 
D2(C, B2) 
D3(C, B3) 

그런 문제가 얼마나 않습니다 (B2에 대한 동일 B3) C.f() 액세스 B1.f() 단지 D1를 통해 B1의 존재를 알고 있기 때문에?

이 경우 다중 상속을 사용하는 것은 좋지 않습니까? 아니면 다중 C과 직계 선형 상속과 다중 상속 (작동하는 경우)보다 나은 방법이 있습니까?

답변

1

궁극적으로 일부 언어에서 다중 상속을 선택 해제하도록 유도 한 다중 상속에 대한 고전적인 문제입니다.

그러나 Python은 교묘하게 제작 된 "메서드 확인 순서"(mro) 알고리즘을 넣은 다음 나중에 super 내장 호출의 출현으로 제거되었습니다. 알고리즘 및 그 역사는 https://www.python.org/download/releases/2.3/mro/

에 자세히 설명되어 있습니다. 그러나 오랜 역사는 짧고 예상대로 작동합니다. 예를 들어, 대화 형 인터프리터에이 코드를 붙여 : 함께 땜질 할 때

class A: pass 
class B(A): 
    def f(self): raise NotImplementedError 
class C(B): 
    def f(self): 
     super().f() 
     print("C") 
class B1(B): f = lambda s: print("B1") 
class B2(B): f = lambda s: print("B2") 
class D(C, B1): pass 
class D1(C, B2): pass 

우리는이 결과를 얻을 :

In [25]: D().f() 
B1 
C 

In [26]: D1().f() 
B2 
C 

In [27]: D.__mro__ 
Out[27]: (__main__.D, __main__.C, __main__.B1, __main__.B, __main__.A, object)