¿Por qué tengo que especificar mi propia clase cuando uso super () y hay una manera de evitarlo?

Al usar el super() Python para hacer el encadenamiento de métodos, debe especificar explícitamente su propia clase, por ejemplo:

 class MyDecorator(Decorator): def decorate(self): super(MyDecorator, self).decorate() 

Tengo que especificar el nombre de mi clase MyDecorator como un argumento para super() . Esto no es SECO. Cuando renombre mi clase ahora tendré que renombrarla dos veces. ¿Por qué se implementa esto de esta manera? ¿Y hay una manera de evitar el tener que escribir el nombre de la clase dos veces (o más)?

El BDFL está de acuerdo. Ver Pep 367 – New Super for 2.6 y PEP 3135 – New Super for 3.0.

Tus deseos se hacen realidad:

Solo usa Python 3.0. En él solo usas super() y lo hace super(ThisClass, self) .

Documentación aquí . Ejemplo de código de la documentación:

 class C(B): def method(self, arg): super().method(arg) # This does the same thing as: super(C, self).method(arg) 

Esta respuesta es incorrecta, intente:

 def _super(cls): setattr(cls, '_super', lambda self: super(cls, self)) return cls class A(object): def f(self): print 'Af' @_super class B(A): def f(self): self._super().f() @_super class C(B): def f(self): self._super().f() C().f() # maximum recursion error 

En Python 2 hay una manera de usar decorador:

 def _super(cls): setattr(cls, '_super', lambda self: super(cls, self)) return cls class A(object): def f(self): print 'Af' @_super class B(A): def f(self): self._super().f() B().f() # >>> Af 

También puede evitar escribir un nombre de clase concreto en versiones anteriores de python usando

 def __init__(self): super(self.__class__, self) ...