Вызов родительского родительского метода, который был переопределен родительским

Как вы называете метод более одного класса цепочкой наследования, если он был переопределен другим классом на этом пути?

class Grandfather(object):
    def __init__(self):
        pass

    def do_thing(self):
        # stuff

class Father(Grandfather):
    def __init__(self):
        super(Father, self).__init__()

    def do_thing(self):
        # stuff different than Grandfather stuff

class Son(Father):
    def __init__(self):
        super(Son, self).__init__()

    def do_thing(self):
        # how to be like Grandfather?

Ответы

Ответ 1

Если вы всегда хотите Grandfather#do_thing, независимо от того, есть ли Grandfather Father немедленный суперкласс, вы можете явно вызвать Grandfather#do_thing в объекте Son self:

class Son(Father):
    # ... snip ...
    def do_thing(self):
        Grandfather.do_thing(self)

С другой стороны, если вы хотите вызвать метод do_thing суперкласса Father, независимо от того, является ли он Grandfather, вы должны использовать super (как в ответе Тьерри):

class Son(Father):
    # ... snip ...
    def do_thing(self):
        super(Father, self).do_thing()

Ответ 2

Вы можете сделать это, используя:

class Son(Father):
    def __init__(self):
        super(Son, self).__init__()

    def do_thing(self):
        super(Father, self).do_thing()