2011-01-13 97 views
3

爲什麼c.print_a()輸出'B'?Python中的多重繼承問題!

class A(object): 
    def __init__(self): 
     self.some_name = 'A' 

    def print_a(self): 
     print self.some_name 

class B(object): 
    def __init__(self): 
     self.some_name = 'B' 

    def print_b(self): 
     print self.some_name 

class C(A, B): 
    def __init__(self): 
     A.__init__(self) 
     B.__init__(self) 

if __name__ == '__main__': 
    c = C() 
    c.print_a() 

class A(object): 
    def __init__(self, some_name='A'): 
     self.some_name = some_name 

    def print_a(self): 
     print self.some_name 

class B(object): 
    def __init__(self, some_name='B'): 
     self.some_name = some_name 

    def print_b(self): 
     print self.some_name 

class C(A, B): 
    def __init__(self): 
     A.__init__(self, some_name='AAAAA') 
     B.__init__(self, some_name='BBBBB') 

if __name__ == '__main__': 
    c = C() 
    c.print_a() 
+0

感謝您的編輯! – Suge 2011-01-13 07:35:26

+0

我們試着澄清一下:你希望C爲A和B類型的某些對象設置名稱,稍後調用一些print_a和print_b函數來獲取這些名稱? – kriss 2011-01-13 07:50:24

+0

是的!爲什麼我不能像上面那樣格式化代碼? – Suge 2011-01-13 07:54:04

回答

1

這裏只有一個self,而你在B.__init__覆蓋其some_name。也許你已經習慣了C++,其中將有兩個單獨的字段,A.some_nameB.some_name。這個概念不適用於Python,其中屬性是在賦值時動態創建的。

5

這裏只有一個對象; some_name屬性在所有繼承類的方法之間共享。您撥打A.__init__,將其設置爲A,然後B.__init__,將其更改爲B

另請注意,您正在調用基本方法不正確;使用super

class A(object): 
    def __init__(self): 
     self.some_name = 'A' 
     super(A, self).__init__() 

    def print_a(self): 
     print self.some_name 

class B(object): 
    def __init__(self): 
     self.some_name = 'B' 
     super(B, self).__init__() 

    def print_b(self): 
     print self.some_name 

class C(A, B): 
    def __init__(self): 
     super(C, self).__init__() 

if __name__ == '__main__': 
    c = C() 
    c.print_a() 
1

說你要C到爲A型的一些對象和B組的名稱,後來調用C類對象的某些print_a和print_b方法獲得這些名字回來?

您可以使用C++繼承模型來獲得這種類型的行爲,但python模型是非常不同的。只有一個對象具有一組字段。如果你想要C++的行爲,最簡單的方法可能是聲明子對象(它看起來像是繼續濫用繼承而非構造)。

貌似你試圖做類似如下:

class Printable(object): 
    def __init__(self, name): 
     self.name = name 

    def myprint(self): 
     print self.name 

class C(object): 
    def __init__(self): 
     self.a = Printable('A') 
     self.b = Printable('B') 

    def print_a(self): 
     self.a.myprint() 

    def print_b(self): 
     self.a.myprint() 

if __name__ == '__main__': 
    c = C() 
    c.print_a()