tutorial lenguaje espaƱol descargar python

lenguaje - python tutorial



super() falla con error: TypeError "argumento 1 debe ser tipo, no classobj" (4)

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 "súper" 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

FYI, aquí está la ayuda (súper) de Python en sí:

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) |


Además, si no puede cambiar la clase B, puede corregir el error utilizando 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)


Su problema es que la clase B no está declarada como una clase de "nuevo estilo". Cambiarlo así:

class B(object):

y funcionará

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

Las clases antiguas (también conocidas como clases "clásicas") siempre son de tipo classobj ; las clases de nuevo estilo son de tipo type . Es por eso que recibiste el mensaje de error que viste:

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

Pruebe esto para verlo usted mismo:

class OldStyle: pass class NewStyle(object): pass print type(OldStyle) # prints: <type ''classobj''> print type(NewStyle) # prints <type ''type''>

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


También me enfrenté al problema publicado cuando utilicé 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 programa y funcionó.

__metaclass__ : __metaclass__ la transición de las clases antiguas y las nuevas.