2016-09-28 75 views
-2

我只是想創建一個繼承父類屬性和方法的類。讓我們只說兩個父類是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 

然後我不知道如何創建它繼承這兩種方法,並從其父母屬性的子類℃。我可以做這樣的事情,但我敢肯定這是不是很Python的...

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()) 

我不知道如何設置up super繼承父母的方法和屬性,我將不勝感激任何幫助!順便說一下:A類和B類不應該相互依賴。

+0

這種信息可以通過快速的Google搜索輕鬆找到。 – techydesigner

回答

0

據我所知,super的工作方式是,根據在子類開頭聲明的超類列表,可以計算出mro(方法解析順序)列表。當您撥打supper(Python 3)時,將調用mro列表中第一類的__init____init__也預計將包含另一個super(),以便mro中的下一個類的__init__也被調用。

在你的情況下,mro列表應該是[A, B]。所以的A必須包含super的調用,以便的B也被調用。

這裏的問題是:

  • 你想AB不依賴對方。使用super需要一個mro列表,如上所述,該列表不符合此要求。
  • C__init__有2個參數,而那些AB只有1.您可以通過aA,但我不知道是否有一種方法可以讓你通過bB

所以,在我看來,super不能在這種情況下幫助。

+0

嘿。感謝您的回答。我只是留下了顯式的構造函數調用,因爲它們是在原始文章中定義的。似乎很好地工作! – HansSnah