Understanding Python super()
The reason we use super
is so that child classes that may be using cooperative multiple inheritance will call the correct next parent class function in the Method Resolution Order (MRO).
In Python 3, we can call it like this:
In Python 2, we are required to use it like this:
Without super, you are limited in your ability to use multiple inheritance:
I further explain below.
"What difference is there actually in this code?:"
The primary difference in this code is that you get a layer of indirection in the __init__
with super
, which uses the current class to determine the next class's __init__
to look up in the MRO.
I illustrate this difference in an answer at the canonical question, How to use 'super' in Python?, which demonstrates dependency injection and cooperative multiple inheritance.
If Python didn't have super
super
Here's code that's actually closely equivalent to super
(how it's implemented in C, minus some checking and fallback behavior, and translated to Python):
Written a little more like native Python:
If we didn't have the super
object, we'd have to write this manual code everywhere (or recreate it!) to ensure that we call the proper next method in the Method Resolution Order!
How does super do this in Python 3 without being told explicitly which class and instance from the method it was called from?
It gets the calling stack frame, and finds the class (implicitly stored as a local free variable, __class__
, making the calling function a closure over the class) and the first argument to that function, which should be the instance or class that informs it which Method Resolution Order (MRO) to use.
Since it requires that first argument for the MRO, using super
with static methods is impossible.
Criticisms of other answers:
super() lets you avoid referring to the base class explicitly, which can be nice. . But the main advantage comes with multiple inheritance, where all sorts of fun stuff can happen. See the standard docs on super if you haven't already.
It's rather hand-wavey and doesn't tell us much, but the point of super
is not to avoid writing the parent class. The point is to ensure that the next method in line in the method resolution order (MRO) is called. This becomes important in multiple inheritance.
I'll explain here.
And let's create a dependency that we want to be called after the Child:
Now remember, ChildB
uses super, ChildA
does not:
And UserA
does not call the UserDependency method:
But UserB
, because ChildB
uses super
, does!:
Last updated