父方法被孩子覆盖

时间:2018-10-03 20:25:46

标签: python python-3.x inheritance

让我们说:

class Parent():
    def __init__(self):
        foo()

    def foo(self):
        //do stuff

class Child(Parent):
    def __init__(self):
        Parent.__init__()

class Grandchild(Child):
    def __init__(self):
        Child.__init__()

    def foo(self):
        //different stuff

Child级别上有许多使用相同的foo()的类。 Grandchild级别的foo版本略有不同,但是启动Grandchild时,foo()中的Parent.__init__()调用使用Parent.foo()而不是Grandchild.foo()

遇到这种情况是否有正确的做法?

1 个答案:

答案 0 :(得分:1)

您没有正确调用基类的__init__()方法-您需要将self参数传递给它们:

class Parent:
    def __init__(self):
        self.foo()

    def foo(self):
        print('Parent stuff')

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)

class Grandchild(Child):
    def __init__(self):
        Child.__init__(self)

    def foo(self):
        print('Grandchild stuff')

if __name__ == '__main__':
    gc = Grandchild()  # -> Grandchild stuff

如果您使用super()而不是明确声明基类,则不必这样做:

class Parent:
    def __init__(self):
        self.foo()

    def foo(self):
        print('Parent stuff')

class Child(Parent):
    def __init__(self):
#        Parent.__init__(self)
        super().__init__()

class Grandchild(Child):
    def __init__(self):
#        Child.__init__(self)
        super().__init__()

    def foo(self):
        print('Grandchild stuff')

if __name__ == '__main__':
    gc = Grandchild()  # -> Grandchild stuff

另一个优点是,如果您更改了子类的基类,则不必更改其__init__()方法中的代码。