我在一个小型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"));
有人可以向我解释错误的原因以及如何解决?如果需要,我可以提供更多信息。
答案 0 :(得分:26)
发生此错误的另一种方式是在Jupiter笔记本中用类重新加载模块。
答案 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)
这是一个简单的解决方案/解决方法,对我一直有效,直到问题解决为止
1001xx
这样的错字答案 3 :(得分:4)
在python3中详细说明@OğuzŞerbetci的答案(仅在Jupyter中不需要),例如,当需要重新加载库时,例如,我们将class Parent
和class 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()