2018-10-25
刚遇到一个问题。当类C继承类A和类B时,我希望super(C, self).__init__()
能把类A和类B的初始化方法都调用一下,然而
class A(object):
def __init__(self):
self.a = 'a'
class B(object):
def __init__(self):
self.b = 'b'
class C(A, B):
def __init__(self):
super(C, self).__init__()
>>> c = C()
>>> c.a
'a'
>>> c.b
Traceback (most recent call last):
File "<input>", line 1, in <module>
c.b
AttributeError: 'C' object has no attribute 'b'
而如果强调类A、B均继承同一基类(即使是默认的object也行)的话,运行结果则如预期。
class A(object):
def __init__(self):
super(A, self).__init__()
self.a = 'a'
class B(object):
def __init__(self):
super(B, self).__init__()
self.b = 'b'
class C(A, B):
def __init__(self):
super(C, self).__init__()
>>> c = C()
>>> c.a
'a'
>>> c.b
'b'
如果手动在C类初始化方法中指明类A和类B的初始化方法,同样可行。
class A(object):
def __init__(self):
self.a = 'a'
class B(object):
def __init__(self):
self.b = 'b'
class C(A, B):
def __init__(self):
A.__init__(self)
B.__init__(self)
>>> c = C()
>>> c.a
'a'
>>> c.b
'b'
为什么第一个版本的代码不能如期望的那样执行?
另外,随手查了一下别人踩过的python多重继承的坑,除此之外还有很多。所以我还是重新设计一下类的结构,避免不必要的麻烦算了。