Python中的多重继承问题!

3 投票
3 回答
2502 浏览
提问于 2025-04-16 09:53

为什么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 个回答

1

假设你想让C为一些类型为A和B的对象设置名字,然后在调用一些print_a和print_b方法时能够获取这些名字?

在C++中,你可以通过继承的方式实现这种行为,但在Python中,模型是完全不同的。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()
1

在这里只有一个 self,而你在 B.__init__ 里覆盖了它的 some_name。也许你习惯于 C++,在那种语言里会有两个不同的字段,分别是 A.some_nameB.some_name。但这个概念在 Python 中不适用,因为在 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()

撰写回答