Python中的多重继承问题!

时间:2011-01-13 07:31:30

标签: python multiple-inheritance

为什么c.print_a()输出'B'?

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分: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()