Python中的多重继承问题!

问题描述:

为什么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

这里只有一个self,而你在B.__init__覆盖其some_name。也许你已经习惯了C++,其中将有两个单独的字段,A.some_nameB.some_name。这个概念不适用于Python,其中属性是在赋值时动态创建的。

这里只有一个对象; 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() 

说你要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()