2011-01-13 17 views
7

¿Por qué no puedo usar super para obtener un método de la clase superior de una clase?Python: ¿Por qué no puedo usar `super` en una clase?

Ejemplo:

Python 3.1.3 
>>> class A(object): 
...  def my_method(self): pass 
>>> class B(A): 
...  def my_method(self): pass 
>>> super(B).my_method 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    super(B).my_method 
AttributeError: 'super' object has no attribute 'my_method' 

(Por supuesto, esto es un caso trivial en que sólo podía hacer A.my_method, pero necesitaba esto para un caso de diamante herencia.)

Según super 's documentación, parece que lo que quiero debería ser posible. Esta es la documentación super 's: (El énfasis es mío)

super() -> mismo que super(__class__, <first argument>)

super(type) -> objeto no unido súper

super(type, obj) -> obligado super objeto; requiere isinstance(obj, type)

super (tipo, tipo2) -> límite super objeto; requiere issubclass (tipo2, tipo)

[ejemplos no relevantes redactado]

+0

He eliminado mi respuesta - Tengo el mismo error. Muy extraño, lo investigaré un poco más. –

Respuesta

7

Según this Parece que sólo hay que llamar super(B, B).my_method:

>>> super(B, B).my_method 
<function my_method at 0x00D51738> 
>>> super(B, B).my_method is A.my_method 
True 
+0

Interesante. No sabía que eso funcionaría. – James

+1

Me alegro de que la fuente vinculada me haya ayudado. :) – James

+3

Recuerde que esto le dará métodos sin consolidar; la razón por la que normalmente debe decir 'super (B, self)' es obtener un súper objeto vinculado a un objeto para recuperar los métodos enlazados. –

8

Parece como si se necesita una instancia de B a pasar como segundo argumento.

http://www.artima.com/weblogs/viewpost.jsp?thread=236275

+0

+1, buena lectura, la parte 2/3 de esta serie de artículos describe los problemas exactos y el caso de uso real de los 'súper objetos independientes': http://www.artima.com/weblogs/viewpost.jsp?thread=236278 (Los secretos de super objetos independientes) – ChristopheD

Cuestiones relacionadas