super () falla con error: TypeError “argumento 1 debe ser de tipo, no classobj” cuando el padre no hereda del objeto

Me sale un error que no puedo entender. ¿Alguna pista de lo que está mal con mi código de muestra?

class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1) 

Obtuve el código de prueba de muestra de la ayuda del método ‘super’ incorporado. La clase “C” es la

Aquí está el error:

 Traceback (most recent call last): File "./test.py", line 10, in ? print C().meth(1) File "./test.py", line 8, in meth super(C, self).meth(arg) TypeError: super() argument 1 must be type, not classobj 

Para tu información, aquí está la ayuda (super) de Python:

 Help on class super in module __builtin__: class super(object) | super(type) -> unbound super object | super(type, obj) -> bound super object; requires isinstance(obj, type) | super(type, type2) -> bound super object; requires issubclass(type2, type) | Typical use to call a cooperative superclass method: | class C(B): | def meth(self, arg): | super(C, self).meth(arg) | 

Su problema es que la clase B no se declara como una clase de “nuevo estilo”. Cambiarlo de esta manera:

 class B(object): 

y funcionará.

super() y todas las cosas de subclase / superclase solo funcionan con clases de nuevo estilo. Te recomiendo que tengas la costumbre de escribir siempre ese (object) en cualquier definición de clase para asegurarte de que sea una clase de nuevo estilo.

Las clases de estilo antiguo (también conocidas como clases “clásicas”) son siempre de tipo classobj ; Las clases de nuevo estilo son de tipo type . Por eso recibiste el mensaje de error que viste:

TypeError: super() argument 1 must be type, not classobj

Intenta esto para ver por ti mismo:

 class OldStyle: pass class NewStyle(object): pass print type(OldStyle) # prints:  print type(NewStyle) # prints  

Tenga en cuenta que en Python 3.x, todas las clases son de estilo nuevo. Aún puede utilizar la syntax de las clases de estilo antiguo, pero obtiene una clase de estilo nuevo. Entonces, en Python 3.x no tendrás este problema.

Además, si no puede cambiar la clase B, puede corregir el error utilizando la herencia múltiple.

 class B: def meth(self, arg): print arg class C(B, object): def meth(self, arg): super(C, self).meth(arg) print C().meth(1) 

Si la versión de python es 3.X, está bien.

Creo que tu versión de python es 2.X, el super funcionaría al agregar este código

 __metaclass__ = type 

entonces el código es

 __metaclass__ = type class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1) 

También me enfrenté con el problema publicado cuando usé Python 2.7. Está funcionando muy bien con python 3.4.

Para que funcione en python 2.7, agregué el __metaclass__ = type en la parte superior de mi progtwig y funcionó.

__metaclass__ : __metaclass__ la transición de clases de estilo antiguo y clases de estilo nuevo.