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.