2016-07-15 17 views
0

說我有以下如何改變在Python的基類

Class A(object): 
    base Functions 

Class B (A): 
    some useful functions 

Class C(object) 
    req base functions 

現在我要創建具有不同於B,而不是函數的所有函數的類從A指的是從功能C. 東西像

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

,我實現它現在複製粘貼整個B級和由C繼承只是代替A. 有沒有更好的辦法來解決這個問題的方法?

成分可以肯定地解決問題,但B類已經在大量使用,所以我不想改變它。

+0

很肯定重複,這是你在找什麼http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple - 繼承。如果不是,你可以指定它有什麼不同? –

回答

0

更改B類的__bases__屬性。

那麼,它的醜陋,但它的工作原理:

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。我不知道這個功能。但我想創建一個新的類D,它完全像B只從C繼承。我不想改變B本身的基礎。 B的對象不應該看到任何改變。 –