method - super() python
Uso de Python 3 super() (2)
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)
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__, <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)
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 super objeto unido y no ligado?
- ¿Cuándo usar
super(type, obj)
ysuper(type, type2)
? - ¿Sería mejor nombrar a la superclase como en
Mother.__init__(...)
?
Usemos las siguientes clases para la demostración:
class A(object):
def m(self):
print(''m'')
class B(A): pass
El super
no enlazado no distribuye el acceso de atributo a la clase, debe usar el protocolo de descriptor:
>>> 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
objeto vinculado a instancia da métodos vinculados:
>>> super(B, B()).m
<bound method B.m of <__main__.B object at 0xb765dacc>>
>>> super(B, B()).m()
m
super
objeto unido a la clase da función (métodos independientes en términos de 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
Consulte la serie de publicaciones de blog "Cosas que debe saber sobre Python Super" de Michele Simionato ( 1 , 2 , 3 ) para obtener más información