python 多重继承的一个问题

2018-10-25  本文已影响18人  lxt

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多重继承的坑,除此之外还有很多。所以我还是重新设计一下类的结构,避免不必要的麻烦算了。

上一篇下一篇

猜你喜欢

热点阅读