出于某种原因,super()
方法并不总是按预期运行,选择返回:
TypeError('super(type, obj): obj must be an instance or subtype of type)'
我理解错误的含义。我不明白为什么它会出现错误。这是破解的代码片段。系统中的所有对象都是新样式对象。
真正有趣的是,此错误总是显示出来。我不知道是什么导致了它。 super()
中的Retrieval
方法正在传递Retrieval
类,然后将其自身作为对象,据我所知,这正是super()
的确切位置< em>假设被调用。
有什么想法吗?
在文件 DBConnection.py :
中class DBAdminConnection(object):
def __init__(self):
self.user = DBUserConnection().user
self.submissions = DBSubmissionConnection()
在文件 Retrieval.py
中class Retrieval(DBConnection.DBAdminConnection):
def __init__(self, username=None, password=None, unique_key=None):
super(Retrieval,self).__init__()
if username and password:
self.username = username
self.user.login(username,password, config.DATABASE)
if self.user.error:
raise UserLoginError(username)
self.unique_key = unique_key
答案 0 :(得分:57)
你是否正在以某种方式重新加载模块?如果是这样,那可以解释这个错误。
显然,由于内存引用的更改, isinstance(self,DBAdminConnection)
在重新加载模块后可能会变为false。
编辑:如果您在mod_wsgi下运行web.py应用,请确保禁用自动重载:
app = web.application(urls, globals(), autoreload=False)
答案 1 :(得分:12)
如果您使用reload()作为工作流的一部分,您显然还需要使用super(self.__class__, self).__init__
进行继承初始化。
我怀疑你会发现这个错误与id(self.__class__) ==id(Retrieval)
失败一致。
答案 2 :(得分:1)
我不确定错误发生的原因,但作为调试的辅助,您可以在super
块中包含对try/except
的调用,并在引发异常时执行数据转储。像这样:
class Retrieval(DBConnection.DBAdminConnection):
def __init__(self, username=None, password=None, unique_key=None):
try:
super(Retrieval,self).__init__()
except TypeError, e:
print "Failure initialising Retrieval --> self: %r"
raise
if username and password:
self.username = username
self.user.login(username,password, config.DATABASE)
if self.user.error:
raise UserLoginError(username)
self.unique_key = unique_key
答案 3 :(得分:1)
我遇到了同样的问题,在jupyter笔记本中运行我的代码。我正在使用重新加载,所以我重新启动了我的内核以跟进Eduardo Ivanec的回复,试着看看这是不是问题。然后我的代码破了。我发现我的问题与几个继承层有关,其中底层是在上面模块中的第二个底层。
class MyClass1(object):
'''example class 1'''
class MyClass2(MyClass1):
'''example class 2'''
def __init__(self):
super(MyClass2, self).__init__()
class MyClass4(MyClass3):
'''example class 4 - no __init__ definition'''
class MyClass3(MyClass2):
'''example class 3 - no __init__ definition'''
当我将MyClass4移到MyClass3下面时,它修复了问题。
这可能是一个新手的错误,所以它可能无法解决上述原始问题的原因,但我想我会发布以防其他新手,像我一样,谁也在做同样的事情错误。
(道歉,如果我的风格错了,这是我在Stack Overflow上的第一篇文章。:))
答案 4 :(得分:1)
我有同样的错误然后我注意到我在同一个file.py中有重复的类(我的错误)。当我将第二个A类重命名为B类时,错误消失了
#Just some example below, not real code
class A (object):
def fun(self):
super(A, self).fun()
class A (object): ##This second class with same name (A) caused the error
def some_fun(self,x,y):