Python中的多重继承问题!
为什么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_name
和 B.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()