2016-07-15 7 views
0

는 A가 C를 뭔가에서 기능을 의미에서 지금은 B에서 대신 기능의 모든 기능을 가진 클래스를 만들려면 내가파이썬의 기본 클래스를 변경하는 방법

Class A(object): 
    base Functions 

Class B (A): 
    some useful functions 

Class C(object) 
    req base functions 

다음 한 말

Class D(B,C) 
    and when B calls super it should look in C instead of A 

지금 그것을 달성하고 사본이 전체 클래스 B를 붙여 넣기하고 단지 A. 이 문제를 해결하기 위해 더 나은 방법이 있나요 대신 C에서 상속 방법처럼?

컴포지션이 문제를 확실하게 해결할 수 있지만 클래스 B는 이미 많이 사용 중이므로 변경하고 싶지 않습니다.

+0

의 중복입니다

참고 이것은 당신이 http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple 찾고있는 것입니다 상속. 그렇지 않다면 어떻게 다르게 지정 할 수 있습니까? –

답변

0

__bases__ 속성을 B 클래스로 변경하십시오.

글쎄, 그것은 추한지만 작동합니다

class A(object): 
    def f(self): 
     print("A.f()") 

class B (A): 
    def g(self): 
     print("B.g()", end=": ") 
     super(B, self).f() 

class C(object): 
    def f(self): 
     print("C.f()") 


B.__bases__ = (C,) 
b = B() 
b.g() 

당신이 얻을 :

B.g(): C.f() 

당신은 당신의 단위 테스트하는 동안 그것을 할 fudge.patch를 사용할 수 있습니다. 귀하의 질문에 확신 How to dynamically change base class of instances at runtime?

+0

감사합니다. Laurent. 나는 그 기능을 몰랐다. 그러나 B가 C에서 상속받은 것과 완전히 똑같은 새로운 클래스 D를 만들고 싶습니다. B 자체의 기본을 변경하고 싶지 않습니다. B의 객체는 어떤 변화도 보지 않아야합니다. –

관련 문제