Which of the 4 ways to call super() in Python 3 to use?

Let’s use the following classes for demonstration:

class A(object):
    def m(self):
        print('m')

class B(A): pass

Unbound super object doesn’t dispatch attribute access to class, you have to use descriptor protocol:

>>> super(B).m
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'm'
>>> super(B).__get__(B(), B)
<super: <class 'B'>, <B object>>

super object bound to instance gives bound methods:

>>> super(B, B()).m
<bound method B.m of <__main__.B object at 0xb765dacc>>
>>> super(B, B()).m()
m

super object bound to class gives function (unbound methods in terms of Python 2):

>>> super(B, B).m
<function m at 0xb761482c>
>>> super(B, B).m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: m() takes exactly 1 positional argument (0 given)
>>> super(B, B).m(B())
m

See Michele Simionato’s “Things to Know About Python Super” blog posts series (1, 2, 3) for more information

Leave a Comment