2011-10-10 11 views

risposta

14

Non è possibile utilizzare una chiamata super() nuda che non contiene alcun tipo/classe. Né puoi implementare un sostituto che funzioni. Python 3.x contiene il supporto speciale per abilitare nudi super() chiamate (pone una variabile __class__ cella in tutte le funzioni definite all'interno di una classe - vedere PEP 3135

+1

Grazie. Ero confuso perché una versione precedente di questo PEP diceva che avresti importato con 'from __future__ import new_super' che non funziona. –

6

No non si può. Ma è possibile utilizzare Python 2 super() in Python 3.

3

Nota Si tratta di una "soluzione" terribile, ho posto solo per ! assicuratevi di non farlo a casa
ripeto: non fare questo

Uno può pensare di utilizzare questo mixin

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 

di ottenere un self.super():

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

cedevole:

>>> a = A() 
A 
>>> b = B() 
B 
A 

Ma attenzione: Questo self.super() non è equivalente ai super(B, self) - se A chiamato anche self.super().__init__(), la costruzione di un B causerebbe il costruttore A chiamare indefinitamente, in quanto self.__class__ rimarrà B . Ciò è dovuto alla mancanza dello __class__ menzionato nello accepted answer. È possibile aggirare questo problema con una macchina a stati nascosti o un metaclasse sofisticato che, ad es. controlla la posizione attuale della classe in self.__class__.mro(), ma ne vale davvero la pena? Probabilmente no ...

15

Mi rendo conto che questa domanda è vecchia e la risposta selezionata potrebbe essere stata corretta al momento, ma non è più completa. Non è ancora possibile utilizzare super() a 2.5.6, ma python-future fornisce un back-ported implementation per 2.6+:

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

Se si utilizza pylint, è possibile disattivare gli avvisi legacy con il commento:

# pylint: disable=missing-super-argument 
+0

Bello, grazie :) –