24

I wonder when to use what flavour of Python 3 super().

Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)

Until now I've used super() only without arguments and it worked as expected (by a Java developer).

Questions:

  • What does "bound" mean in this context?
  • What is the difference between bound and unbound super object?
  • When to use super(type, obj) and when super(type, type2)?
  • Would it be better to name the super class like in Mother.__init__(...)?
smci
  • 32,567
  • 20
  • 113
  • 146
deamon
  • 89,107
  • 111
  • 320
  • 448

2 Answers2

21

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

jjack
  • 13
  • 3
Denis Otkidach
  • 32,032
  • 8
  • 79
  • 100
  • 1
    The question is specifically about Python3, but Simionato's blog posts series are about Python2, and mention that *The advantage is that you avoid to repeat the name of the class in the calling syntax, since that name is hidden in the mangling mechanism of private names.*. This is no longer true in Python3, so at least that one advantage is dated. – gerrit Nov 10 '16 at 12:11
  • This answers the OP's "what does each do?" but it doesn't answer "when would you use each one?" Also it doesn't actually explain "unbound" vs "bound"; if `B` is a class name and `b = B()` is an instance, then `B` is an unbound object and `b` is a bound object. – smci Sep 10 '18 at 08:53
9

A quick note, the new usage of super is outlined in PEP3135 New Super which was implemented in python 3.0. Of particular relevance;

super().foo(1, 2)

to replace the old:

super(Foo, self).foo(1, 2)
danodonovan
  • 19,636
  • 10
  • 70
  • 78