super(tipo, obj): obj debe ser una instancia o subtipo de tipo

5 minutos de lectura

Avatar de usuario de Arefe
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

Avatar de usuario de Oğuz Şerbetci
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

Avatar de usuario de Moses Koledoye
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

Avatar de usuario de Mike W
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 typela 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

  1. Agregar error tipográfico como 1001xx en la parte inferior del archivo que llamas en la celda
  2. Ejecute su celda: verá alguna excepción, solo omítala
  3. Eliminar el error tipográfico que se agregó en el paso 1
  4. ejecutar la celda
  5. 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

Avatar de usuario de Eldamir
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 superdentro 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

avatar de usuario de apeinsuit
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

¿Ha sido útil esta solución?