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:
super(type, obj)
y cuando super(type, type2)
? 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)