Calling a parent's parent's method, which has been overridden by the parent

16,176

Solution 1

If you always want Grandfather#do_thing, regardless of whether Grandfather is Father's immediate superclass then you can explicitly invoke Grandfather#do_thing on the Son self object:

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

On the other hand, if you want to invoke the do_thing method of Father's superclass, regardless of whether it is Grandfather you should use super (as in Thierry's answer):

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

Solution 2

You can do this using:

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

    def do_thing(self):
        super(Father, self).do_thing()
Share:
16,176
cosmo_kramer
Author by

cosmo_kramer

Updated on June 05, 2022

Comments

  • cosmo_kramer
    cosmo_kramer about 2 years

    How do you call a method more than one class up the inheritance chain if it's been overridden by another class along the way?

    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?
    
  • outis nihil
    outis nihil about 9 years
    is there a reason to prefer your answer to Thierry J's?
  • Sean Vieira
    Sean Vieira about 9 years
    Use this one if you always want Grandfather, regardless of whether it is Father's immediate superclass. Use Thierry's if you want Father's superclass, regardless of whether it is Grandfather.
  • Hamlett
    Hamlett over 8 years
    Following the comment of @Sean Vieira, in this case you will use the 'do_thing' method of the immediate Father's superclass what doesn't assure that it will be the 'Grandfather's method (in case of multi inherence)