¿Cuál de las 4 formas de llamar a super () en Python 3 para usar?

Me pregunto cuándo usar qué sabor de Python 3 super ().

Help on class super in module builtins: class super(object) | super() -> same as super(__class__, ) | 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) 

Hasta ahora he usado super() solo sin argumentos y funcionó como esperaba (por un desarrollador de Java).

Preguntas:

  • ¿Qué significa “ligado” en este contexto?
  • ¿Cuál es la diferencia entre un súper objeto unido y no unido?
  • ¿Cuándo usar super(type, obj) y cuando super(type, type2) ?
  • ¿Sería mejor nombrar a la súper clase como en Mother.__init__(...) ?

Usemos las siguientes clases para demostración:

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

El super objeto no consolidado no despacha el acceso de atributo a la clase, tiene que usar el protocolo descriptor:

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

super objeto enlazado a la instancia proporciona métodos enlazados:

 >>> super(B, B()).m > >>> super(B, B()).m() m 

super objeto vinculado a la clase proporciona una función (métodos no vinculados en términos de Python 2):

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

Consulte la serie de publicaciones del blog “Cosas que debe saber sobre el Super de Python” de Michele Simionato ( 1 , 2 , 3 ) para obtener más información.

Una nota rápida, el nuevo uso de super se describe en PEP3135 New Super, que se implementó en Python 3.0. De particular relevancia;

 super().foo(1, 2) 

para reemplazar lo viejo:

 super(Foo, self).foo(1, 2)