2016-07-15 3 views
0

Скажем, у меня есть следующиеКак изменить базовый класс в Python

Class A(object): 
    base Functions 

Class B (A): 
    some useful functions 

Class C(object) 
    req base functions 

Теперь я хочу, чтобы создать класс, который имеет все функции из B, но вместо функций от А относится к функциям от С. Something как

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

таким образом, что я ее достижения теперь копия вставляя весь класс B и просто унаследовать от 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

Спасибо Лоран. Я не знал об этой функциональности. Но я хочу создать новый класс D, который точно так же, как B, наследуется только от C. Я не хочу менять базу самого B. Объекты B не должны видеть никаких изменений. –

Смежные вопросы