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()
Author by
cosmo_kramer
Updated on June 05, 2022Comments
-
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 about 9 yearsis there a reason to prefer your answer to Thierry J's?
-
Sean Vieira about 9 yearsUse this one if you always want
Grandfather
, regardless of whether it isFather
's immediate superclass. Use Thierry's if you wantFather
's superclass, regardless of whether it isGrandfather
. -
Hamlett over 8 yearsFollowing 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)