Python多重继承示例

时间:2015-09-16 18:44:38

标签: python class python-2.7 multiple-inheritance super

我有这种情况

class A(object):

    def __init__(self):
        self.x = 0
        self.y = 0

class B(A):
    def __init__(self):
        super(B, self).__init__()

    def method(self):
        self.x += 1

class C(A):

    def __init__(self):
        super(C, self).__init__()

    def method(self):
        self.y += 1

class D(B, C):

    def __init__(self):
        super(D, self).__init__()

    def method(self):
        print self.x
        print self.y

我希望D为x和y打印1,但它打印0 我不完全理解多重继承/超级/等等......虽然我一直在尝试阅读文档,但对这个例子的解释对我来说非常有用。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您在示例中覆盖了method之类的方法,但仍希望获得基类的行为以及您自己的行为,则需要使用super来调用该版本的你重写的方法。

class A(object):
    def __init__(self):
        self.x = 0
        self.y = 0

    def method(self):  # we need a verion of method() to end the super() calls at
        pass

class B(A):
    def method(self):
        super(B, self).method() # call overridden version of method()
        self.x += 1

class C(A):
    def method(self):
        super(C, self).method() # here too
        self.y += 1

class D(B, C):
    def method(self):
        super(D, self).method() # and here
        print self.x
        print self.y

我已删除子类中不必要的__init__方法。除非您改变其行为,否则不需要覆盖方法,并且后来的__init__方法都没有做任何其他事情,除了调用它们的前任。

答案 1 :(得分:1)

创建D对象时,它永远不会调用名为'method'的方法。 它只会调用父级的“ init ”方法。所以x或y不会改变。

答案 2 :(得分:0)

您还可以为D子类中的继承类调用方法 D(B,C)类:

def __init__(self):
    B.__init__(self)
    C.__init__(self)

def method(self):
    B.method(self)
    C.method(self)
    print(self.x)
    print(self.y)