我有这种情况
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 我不完全理解多重继承/超级/等等......虽然我一直在尝试阅读文档,但对这个例子的解释对我来说非常有用。
谢谢!
答案 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)