En Python 2.5, el siguiente código genera un TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
Si reemplazo el class X
con class X(object)
, funcionará. ¿Cuál es la explicación de esto?
Respuestas:
La razón es que
super()
solo opera en clases de estilo nuevo , lo que en la serie 2.x significa que se extiende desdeobject
:fuente
Además, no use super () a menos que sea necesario. No es lo "correcto" de propósito general que se puede hacer con las clases de estilo nuevo que usted pueda sospechar.
Hay momentos en los que espera una herencia múltiple y posiblemente la desee, pero hasta que conozca los detalles complicados del MRO, es mejor dejarlo en paz y atenerse a:
fuente
__init__
) para pasar argumentos de una manera limpia y sensata, de lo contrario obtendrá TypeErrors o problemas de depuración peores cuando alguien intente heredar de manera múltiple usando su clase. A menos que realmente haya diseñado para admitir MI de esta manera (lo cual es bastante complicado), probablemente sea mejor evitar la implicación desuper
que el método es seguro para MI.En caso de que ninguna de las respuestas anteriores lo mencione claramente. Su clase padre necesita heredar de "objeto", que esencialmente lo convertiría en una nueva clase de estilo.
fuente
Probé los distintos métodos Xa (); sin embargo, parecen requerir una instancia de X para realizar un (), así que hice X (). a (self), que parece más completo que las respuestas anteriores, al menos para las aplicaciones que he encontrado. No parece ser una buena manera de manejar el problema ya que hay una construcción y destrucción innecesarias, pero funciona bien.
Mi aplicación específica fue el módulo cmd.Cmd de Python, que evidentemente no es un objeto NewStyle por alguna razón.
Resultado final:
fuente