Arefe
¿Por qué recibo el siguiente error y cómo lo resuelvo?
TypeError: super(type, obj): obj debe ser una instancia o subtipo de tipo
Oğuz Şerbetci
Otra forma en que puede ocurrir este error es cuando recarga el módulo con la clase en un cuaderno de Júpiter.
La solución fácil es reiniciar el kernel.
http://thomas-cokelaer.info/blog/2011/09/382/
Consulte la respuesta de @Mike W para obtener más detalles.
-
Me hace tropezar cada vez. 🙂
– cadolfos
29 de agosto de 2018 a las 19:11
-
Pensé que también me estaba volviendo loco, pero es por eso que seguí recibiendo este error. Simplemente salir y volver a ingresar a Python lo arregló. ¡Gracias!
– rayryeng
15 de julio de 2019 a las 6:41
-
Tengo que leer esto una vez al año, como mi Python Christmas. ¿Alguna forma de arreglar esto para siempre?
–Eric Burel
5 oct 2021 a las 12:07
Moisés Koledoye
Deberías llamar super
utilizando el UrlManager
clase como primer argumento no el URL
modelo. super
no se puede llamar estar con un no relacionado clase/tipo:
De los documentos,
super(type[, object-or-type])
: devuelve un objeto proxy que delega llamadas de método a una clase de tipo padre o hermana.
Vos tambien no puedo hacer:
>>> class D:
... pass
...
>>> class C:
... def __init__(self):
... super(D, self).__init__()
...
>>> C()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
TypeError: super(type, obj): obj must be an instance or subtype of type
Deberías hacer:
qs_main = super(UrlManager, self).all(*args, **kwargs)
O en Python 3:
qs_main = super().all(*args, **kwargs)
-
¿El rastreo sigue siendo el mismo? El que ha mostrado muestra que el error es del
all
método del gerente, que he abordado en mi respuesta.– Moisés Koledoye
3 de mayo de 2017 a las 5:13
-
No he usado mucho Django últimamente, pero me pregunto, ¿hay alguna razón para usar clases de estilo antiguo aquí?
– 0xc0de
10 de noviembre de 2017 a las 11:11
-
También creo que super no funciona con las clases de estilo antiguo, ¿verdad?
– 0xc0de
10 de noviembre de 2017 a las 11:12
-
no se supone que super se llame con la clase principal como primer argumento
– LetsPlayYahtzee
18 de julio de 2018 a las 10:31
mike w
Elaborando en la respuesta de @Oğuz Şerbetci, en python3 (no es necesario solo en Jupyter), cuando existe la necesidad de recargar una biblioteca, por ejemplo, tenemos class Parent
y class Child
definido como
class Parent(object):
def __init__(self):
# do something
class Child(Parent):
def __init__(self):
super(Child, self).__init__(self)
entonces si haces esto
import library.Child
reload(library)
Child()
conseguirás TypeError: super(type, obj): obj must be an instance or subtype of type
la solución es simplemente volver a importar la clase después de la recarga.
import library.Child
reload(library)
import library.Child
Child()
-
Hola, ¿alguna idea de cómo funcionaría esto con la magia de recarga automática?
%reload_ext autoreload
,%autoreload 2
–Eric Burel
21 de enero de 2020 a las 9:16
Solo para Jupyter
Puedes conseguir su problema porque reload
la lógica tiene algunos errores (asunto)
Aquí hay una solución / solución alternativa simple que funciona para mí hasta que el problema no se solucione
- Agregar error tipográfico como
1001xx
en la parte inferior del archivo que llamas en la celda - Ejecute su celda: verá alguna excepción, solo omítala
- Eliminar el error tipográfico que se agregó en el paso 1
- ejecutar la celda
- Ganancia
La mejor solución que he encontrado para este problema solo está disponible usando python 3. Entonces no necesita especificar los argumentos de “super”, entonces ya no tendrá el error al escribir su clase de esta manera:
class D:
pass
class C(D):
def __init__(self):
super().__init__()# no arguments given to super()
-
Lo clavé para mí, no lo hice en eso en el super() cuando lo hice en eso en mi clase
– La risita peluda
27 de septiembre de 2022 a las 4:54
Eldamir
Otra forma interesante es si una combinación de ramas ha duplicado la clase, de modo que en el archivo tenga dos definiciones para el mismo nombre, por ejemplo
class A(Foo):
def __init__(self):
super(A, self).__init__()
#...
class A(Foo):
def __init__(self):
super(A, self).__init__()
#...
Si intenta crear una instancia a partir de una referencia estática a la primera definición de A, una vez que intente llamar super
dentro de __init__
método, A
se referirá a la segunda definición de A
, ya que se ha sobrescrito. La solución, por supuesto, es eliminar la definición duplicada de la clase, para que no se sobrescriba.
Esto puede parecer algo que nunca sucedería, pero me sucedió a mí, cuando no estaba prestando suficiente atención a la fusión de dos ramas. Mis pruebas fallaron con el mensaje de error descrito en la pregunta, así que pensé en dejar mis hallazgos aquí, aunque no responde exactamente a la pregunta específica.
-
Lo clavé para mí, no lo hice en eso en el super() cuando lo hice en eso en mi clase
– La risita peluda
27 de septiembre de 2022 a las 4:54
traje de simio
Este error también aparece cuando simplemente no crea una instancia de la clase secundaria e intenta llamar a un método en una clase en sí, como en:
class Parent:
def method():
pass
class Child(Parent):
def method():
super().method()
P = Parent()
C = Child
C.method()
-
Gracias. Esto es particularmente complicado si está utilizando una clase que no tiene variables miembro. Por ejemplo, todo es decrator de método estático o método de clase. Entonces es posible que se incline a simplemente llamar a MyInstance.mymethod en lugar de MyInstance().mymethod (tenga en cuenta los corchetes)
– también
21 de junio de 2022 a las 13:01