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'
為什么第一個版本的代碼不能如期望的那樣執(zhí)行钧椰?
另外粹断,隨手查了一下別人踩過的python多重繼承的坑,除此之外還有很多嫡霞。所以我還是重新設計一下類的結構瓶埋,避免不必要的麻煩算了。