No haga eso: si super
podría simplemente usar como su primer argumento, entonces no se habría escrito para tomar dos argumentos en primer lugar. Debe pasar la clase real aquí no una expresión que podría cambiar si la clase ha sido subclasificada.
El primer argumento para super debe ser la clase que contiene la definición del método actual, ya que le está diciendo a super dónde en la lista de bases para comenzar su búsqueda.
Python 3 sabe esto y trata super()
mágicamente en tiempo de compilación, pero en Python 2.x es solo una función normal, por lo que no tiene forma de averiguar esos parámetros por sí misma.
[Editar para agregar a mis puntos iniciales] En realidad, hay otra forma menos utilizada de usar super()
en Python 2.x. Se puede utilizar un formulario independiente de super y tenerlo obligado cuando se accede a él:
>>> class A(object):
def foo(self):
print "A.foo"
>>> class B(A):
def foo(self):
self.__super.foo()
print "B.foo"
>>> B._B__super = super(B)
>>> class C(A):
def foo(self):
self.__super.foo()
print "C.foo"
>>> C._C__super = super(C)
>>> class D(C,B): pass
>>> D._D__super = super(D)
>>> D().foo()
A.foo
B.foo
C.foo
No es una captura importante aquí: usted tiene que utilizar un nombre diferente para almacenar cada super
objeto, que se puede hacer mediante el uso de self.__super
, pero no puede crear un super
sin encuadernar directamente en la definición de clase (porque no puede nombrar la clase si aún no existe) y si lo crea afuera tiene que ofuscar el nombre manualmente para asegurarse de establecer el correcto __super
objeto para la clase. Para Python 2.6 y versiones posteriores probablemente puedas terminar esto como un decorador de clases.
Advertencia para cualquiera que lea esto: el código anterior es * incorrecto *. ¡No lo imites! –
Glenn, Duncan: gracias por señalar que esto está mal. Tendré que grep mi código y cambiar esto. –
@Glenn Maynard: No estoy seguro de entender por qué lo considera * incorrecto *. ¿Sería mejor usar 'super (self .__ class__, self)'? – martineau