2011-10-10 13 views

Respuesta

14

No puede usar una llamada super() que no contiene ningún tipo/clase. Tampoco puedes implementar un reemplazo que funcione. 3.x Python contiene un apoyo especial para permitir al descubierto super() llamadas (se coloca una variable __class__ celular en todas las funciones definidas dentro de una clase - ver PEP 3135

+1

Gracias. Estaba confundido porque una versión anterior de este PEP decía que lo importaría con 'from __future__ import new_super' que no funciona. –

6

No, no puedes. Pero puede usar Python 2 super() en Python 3.

3

Nota Esta es una "solución" terrible, lo pongo sólo para ! asegúrese de que no hacer esto en casa
repito: no hacen esto

Uno puede pensar en usar este mixin

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

para obtener una self.super():

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

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

obteniéndose:

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

Pero cuidado: Este self.super() no es equivalente a super(B, self) - si A también llamado self.super().__init__(), la construcción de un B causaría el constructor A para llamarse a sí mismo indefinidamente, ya que self.__class__ se mantendrá B . Esto se debe a la falta del __class__ mencionado en el accepted answer. Posiblemente pueda solucionar este problema con una máquina de estado oculta o una metaclase sofisticada que p. Ej. verifica la posición real de la clase en self.__class__.mro(), pero ¿realmente vale la pena? Probablemente no ...

15

Me doy cuenta de que esta pregunta es antigua, y que la respuesta seleccionada puede haber sido correcta en ese momento, pero ya no está completa. Todavía no se puede utilizar super() en 2.5.6, pero python-future proporciona una back-ported implementation para 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 

Si utiliza pylint, puede desactivar las advertencias de legado con el comentario:

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

Agradable, gracias :) –