super(type,obj):obj必须是类型的实例或子类型

时间:2017-05-03 05:03:43

标签: python django

我在一个小型super(type, obj): obj must be an instance or subtype of type应用上工作并收到错误告诉我views.py。我在介绍函数get_object_or_404后从views.py文件中获取它。下面提供的from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse, HttpResponseRedirect from django.views import View from .models import URL # function based view def redirect_view(request, shortcode=None, *args, **kwargs): obj = get_object_or_404(URL, shortcode=shortcode) return HttpResponse("Hello World, the shortcode is {shortcode}".format(shortcode = obj.url)) # class based view class ShortenerView(View): def get(self, request, shortcode=None, *args, **kwargs): obj = get_object_or_404(URL, shortcode=shortcode) return HttpResponse("Hello World 1, the shortcode is {shortcode}".format(shortcode = obj.url)) def post(self, request, *args, **kwargs): return HttpResponse() 文件

TypeError at /b/p6jzbp/
super(type, obj): obj must be an instance or subtype of type
Request Method: GET
Request URL:    http://127.0.0.1:8000/b/p6jzbp/
Django Version: 1.11
Exception Type: TypeError
Exception Value:    
super(type, obj): obj must be an instance or subtype of type
Exception Location: /Users/Chaklader/Documents/Projects/UrlShortener/src/shortener/models.py in all, line 18

完整的错误消息在这里,

line 18

models.py中的qs_main = super(URL, self).all(*args, **kwargs)models.py# will look for the "SHORTCODE_MAX" in the settings and # if not found, will put the value of 15 there SHORTCODE_MAX = getattr(settings, "SHORTCODE_MAX", 15) class UrlManager(models.Manager): def all(self, *args, **kwargs): qs_main = super(URL, self).all(*args, **kwargs) qs = qs_main.filter(active = True) return qs def refresh_shortcodes(self, items = None): qs = URL.objects.filter(id__gte=1) new_codes = 0 if items is not None and isinstance(items, int): qs = qs.order_by('-id')[:items] for q in qs: q.shortcode = create_shortcode(q) print (q.id, " ", q.shortcode) q.save() new_codes += 1 return "# new codes created {id}".format(id = new_codes) class URL(models.Model): url = models.CharField(max_length = 220, ) shortcode = models.CharField(max_length = SHORTCODE_MAX, blank = True, unique = True) updated = models.DateTimeField(auto_now = True) timestamp = models.DateTimeField(auto_now_add = True) active = models.BooleanField(default = True) objects = UrlManager() def save(self, *args, **kwargs): if self.shortcode is None or self.shortcode == "": self.shortcode = create_shortcode(self) super(URL, self).save(*args, **kwargs) def __str__(self): return str(self.url) def __unicode__(self): return str(self.url) # class Meta: # ordering = '-id' 文件位于此处,

 var filePaths = tblWebsites.Tables[0]
                            .AsEnumerable()
                            .Select(row => row.Field<string>("Filepath"));

有人可以向我解释错误的原因以及如何解决?如果需要,我可以提供更多信息。

6 个答案:

答案 0 :(得分:26)

发生此错误的另一种方式是在Jupiter笔记本中用类重新加载模块。

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

答案 1 :(得分:15)

您应该使用super类作为第一个参数而不是UrlManager模型来调用URL。无法使用无关的类/类型调用super

来自文档,

  

super(type[, object-or-type]):   返回将方法调用委托给父或者的代理对象   兄弟姐妹类型。

所以你不能做:

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

你应该这样做:

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

或者在Python 3中:

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

答案 2 :(得分:6)

仅适用于Jupyter 您可能会遇到他的问题,因为reload逻辑有一些错误(issue

这是一个简单的解决方案/解决方法,对我一直有效,直到问题解决为止

  1. 在您在单元格中调用的文件底部添加像1001xx这样的错字
  2. 运行您的单元格-您会看到一些异常,只需跳过它
  3. 删除在步骤1中添加的错字
  4. 运行单元格
  5. 利润

答案 3 :(得分:4)

在python3中详细说明@OğuzŞerbetci的答案(仅在Jupyter中不需要),例如,当需要重新加载库时,例如,我们将class Parentclass Child定义为

class Parent(object):
    def __init__(self):
        # do something

class Child(Parent):
    def __init__(self):
        super(self,Child).__init__(self)

然后,如果您这样做

import library.Child
reload(library)

Child()

您将获得TypeError: super(type, obj): obj must be an instance or subtype of type,解决方案是在重新加载后重新导入该类

import library.Child
reload(library)
import library.Child

Child()

答案 4 :(得分:3)

另一个有趣的方法是,如果分支的合并重复了类,那么在文件中你有两个相同名称的定义,例如

dict

如果您尝试从静态引用创建实例到A的第一个定义,一旦它尝试调用{firstName: ' '},在class A(Foo): def __init__(self): super(A, self).__init__() #... class A(Foo): def __init__(self): super(A, self).__init__() #... 方法内,super将引用__init__的第二个定义,因为它已被覆盖。解决方案 - 当然 - 是删除类的重复定义,因此不会被覆盖。

这看起来似乎永远不会发生,但它恰好发生在我身上,当时我没有对两个分支的合并给予足够的关注。我的测试失败了,问题中描述的错误消息,所以我想我会在这里留下我的发现,即使它没有完全回答具体问题。

答案 5 :(得分:2)

我为这个问题找到的最好的解决方案只能使用 python 3。然后你不需要指定“super”的参数,这样你就不会再像这样编写你的类了:

class D:
   pass

class C(D):
    def __init__(self):
        super().__init__()# no arguments given to super()