super(type, obj): obj must be an instance or subtype of type

前端 未结 5 1298
天涯浪人
天涯浪人 2020-12-11 00:34

I work on a small Django app and get an error tells me, super(type, obj): obj must be an instance or subtype of type. I get it from the view

相关标签:
5条回答
  • 2020-12-11 00:40

    Elaborating in @Oğuz Şerbetci's answer, in python3 (not necessary only in Jupyter), when there is the need to reload a library, for example we have class Parent and class Child defined as

    class Parent(object):
        def __init__(self):
            # do something
    
    class Child(Parent):
        def __init__(self):
            super(Child, self).__init__(self)
    

    then if you do this

    import library.Child
    reload(library)
    
    Child()
    

    you will get TypeError: super(type, obj): obj must be an instance or subtype of type, the solution is just to re import the class after the reload

    import library.Child
    reload(library)
    import library.Child
    
    Child()
    
    0 讨论(0)
  • 2020-12-11 00:50

    Another way this error can occur is when you reload the module with the class in a Jupiter notebook.

    Easy solution is to restart the kernel.

    http://thomas-cokelaer.info/blog/2011/09/382/

    Check out @Mike W's answer for more detail.

    0 讨论(0)
  • 2020-12-11 01:04

    You should call super using the UrlManager class as first argument not the URL model. super cannot called be with an unrelated class/type:

    From the docs,

    super(type[, object-or-type]): Return a proxy object that delegates method calls to a parent or sibling class of type.

    So you cannot do:

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

    You should do:

    qs_main = super(UrlManager, self).all(*args, **kwargs)
    

    Or in Python 3:

    qs_main = super().all(*args, **kwargs)
    
    0 讨论(0)
  • 2020-12-11 01:04

    For Jupyter only You can get his issue in because reload logic have some bugs (issue)

    Here is a simple solution/workaround that works for me until issue is not fixed

    1. Add typo like 1001xx at the bottom of the file which you call in the cell
    2. Run your cell - you will see some exception, just skip it
    3. Remove typo which was added on step 1
    4. Run the cell
    5. Profit
    0 讨论(0)
  • 2020-12-11 01:05

    Another interesting way is if a merge of branches has duplicated the class, so that in the file you have two definitions for the same name, e.g.

    class A(Foo):
        def __init__(self):
            super(A, self).__init__()
            #...
    
    class A(Foo):
        def __init__(self):
            super(A, self).__init__()
            #...
    

    If you try to create an instance from a static reference to the first definition of A, once it tries to call super, inside the __init__ method, A will refer to the second definition of A, since it has been overwritten. The solution - ofcourse - is to remove the duplicate definition of the class, so it doesn't get overwritten.

    This may seem like something that would never happen, but it just happened to me, when I wasn't paying close enough attention to the merge of two branches. My tests failed with the error message described in the question, so I thought I'd leave my findings here, even though it doesn't exactly answer the specific question.

    0 讨论(0)
提交回复
热议问题