2010-05-05 23 views
20

Me pregunto cuándo usar qué sabor de Python 3 super().Uso 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 utilizado super() sólo sin argumentos y funcionó como se esperaba (por un desarrollador de Java).

Preguntas:

  • ¿Qué significa "obligado" en este contexto?
  • ¿Cuál es la diferencia entre superobjeto enlazado y no unido?
  • Cuándo utilizar super(type, obj) y cuándo super(type, type2)?
  • ¿Sería mejor nombrar a la super clase como en Mother.__init__(...)?

Respuesta

17

Vamos a usar las siguientes clases de demostración:

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

class B(A): pass 

Sin consolidar super objeto no distribuye el acceso atributo a la clase, usted tiene que utilizar el protocolo 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 dependiente por ejemplo, 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 la función (métodos no consolidados 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 

Ver Michele de "Lo que debe saber Python super" serie de publicaciones en el blog (1, 2, 3) Simionato para obtener más información

+0

La pregunta es específicamente sobre python3, pero la serie | Blog de Simionato están a punto python2, y mencionan que * La ventaja es que se evita repetir el nombre de la clase en la sintaxis de llamada, ya que ese nombre está oculto en el mecanismo de manipulación de nombres privados. *. Esto ya no es cierto en Python3, por lo que al menos esa ventaja es anticuada. – gerrit

7

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 sustituir a la antigua:

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