2011-01-13 21 views
7

Perché non è possibile utilizzare super per ottenere un metodo della superclasse di una classe?Python: Perché non posso usare `super` su una classe?

Esempio:

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' 

(Naturalmente questo è un caso banale in cui ho potuto solo fare A.my_method, ma avevo bisogno di questo per un caso di diamante eredità.)

Secondo super 's documentazione, sembra che ciò che voglio dovrebbe essere possibile. Questa è la documentazione super 's: (enfasi mia)

super() -> stessa super(__class__, <first argument>)

super(type) -> non legato oggetto Super

super(type, obj) -> bound super oggetto; richiede isinstance(obj, type)

super (type, type2) -> bound super oggetto; richiede issubclass (tipo2, tipo)

[esempi non rilevanti redatto]

+0

ho cancellato la mia risposta - ho ottenuto lo stesso errore. Molto strano, ci guarderemo un po 'di più. –

risposta

7

Secondo this sembra che ho solo bisogno di chiamare 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

Interessante. Non sapevo che avrebbe funzionato. – James

+1

Felice della fonte collegata aiutato. :) – James

+3

Ricorda che questo ti fornirà metodi non associati; il motivo per cui normalmente devi dire 'super (B, self)' è quello di ottenere un oggetto super legato a un oggetto, per recuperare metodi associati. –

8

Sembra come se avete bisogno di un'istanza di B per passare come secondo argomento.

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

+0

+1, buona lettura, parte 2/3 di questa serie di articoli descrive i problemi esatti e il caso di utilizzo reale per "oggetti super non associati": http://www.artima.com/weblogs/viewpost.jsp?thread=236278 (I segreti degli oggetti super non legati) – ChristopheD

Problemi correlati