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 incorporado 'super'.
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 su 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)
|
Respuestas:
Su problema es que la clase B no se declara como una clase de "estilo nuevo". Cámbialo así:
y funcionará
super()
y todas las cosas de subclase / superclase solo funcionan con clases de estilo nuevo. Te recomiendo que tengas la costumbre de escribir siempre eso(object)
en cualquier definición de clase para asegurarse de que sea una clase de estilo nuevo.Las clases de estilo antiguo (también conocidas como clases "clásicas") son siempre de tipo
classobj
; Las clases de nuevo estilo son de tipotype
. Es por eso que recibió el mensaje de error que vio:TypeError: super() argument 1 must be type, not classobj
Prueba esto para verlo por ti mismo:
Tenga en cuenta que en Python 3.x, todas las clases son de estilo nuevo. Todavía puede usar la sintaxis de las clases de estilo antiguo, pero obtiene una clase de estilo nuevo. Entonces, en Python 3.x no tendrás este problema.
fuente
super()
; Se debe hacer que la clase A funcione con una clase de "estilo antiguo", y posiblemente la mejor manera de hacerlo sería hacer que la clase A sea en sí misma una clase de "estilo antiguo". Por supuesto, recomiendo simplemente actualizar todo su programa para que se ejecute en Python 3.x, para que todas las clases tengan un nuevo estilo sin importar lo que haga; Si esa opción está disponible, es la mejor opción.class B(object):
. Recibo este error debido al uso@mock.patch('module.B', autospec=B)
justo antes de mi caso de prueba. ¿Alguna idea sobre como arreglar esto?Además, si no puede cambiar la clase B, puede corregir el error utilizando la herencia múltiple.
fuente
type
) mientras sigue subclasificando una clase de "estilo antiguo" (cuyo objeto de clase es de tipoclassobj
).super()
funciona con clases de estilo nuevo pero no con clases de estilo antiguo.Si la versión de Python es 3.X, está bien.
Creo que su versión de Python es 2.X, el super funcionaría al agregar este código
entonces el código es
fuente
También me enfrenté al problema publicado cuando usé Python 2.7. Funciona muy bien con Python 3.4.
Para que funcione en Python 2.7, he agregado el
__metaclass__ = type
atributo en la parte superior de mi programa y funcionó.__metaclass__
: Facilita la transición de las clases de estilo antiguo y las clases de estilo nuevo.fuente