Python super()行为不可靠

出于某种原因, super()方法并不总是按预期行事,select返回:

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

我明白错误的含义 。 我不明白为什么它会出现错误。 以下是正在破解的代码片段。 系统中的所有对象都是新的样式对象。

真正有趣的是这个错误并不总是显示出来。 我不知道是什么原因造成的。 Retrievalsuper()方法传递Retrieval类,然后将其本身作为一个对象,就我所知,它应该是如何调用super()

任何想法呢?

在文件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 

你是否正在重新加载模块在事情的中间? 如果是这样,那可能会解释这个错误。

isinstance(self,DBAdminConnection)在重装模块之后可能会因为内存引用的变化而变成false,显然。

编辑:如果你正在mod_wsgi下运行你的web.py应用程序,请确保你禁用自动重载:

 app = web.application(urls, globals(), autoreload=False) 

如果你使用reload()作为工作stream的一部分,你显然还需要使用super(self.__class__, self).__init__来进行inheritance初始化。

我怀疑你会发现这个bug与id(self.__class__) ==id(Retrieval)失败一致。

我不知道为什么错误正在发生,但作为debugging的帮助,你可以在try/except块中将调用包装为super ,并在引发exception时进行数据转储。 像这样的东西:

 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 

我只是有同样的问题,在jupyter笔记本上运行我的代码。 我正在使用重新加载,所以我重新启动了我的内核来跟进Eduardo Ivanec的反应,试试看是否是这个问题。 然后我的代码打破了。 我发现我的问题与几层inheritance有关,底层是在模块的第二底层之上定义的。

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

当我在MyClass3下移动MyClass4时,它解决了这个问题。

这可能是菜鸟的一个错误,所以也许不能解决上面原问题的原因,但是我以为我会张贴,如果还有其他的新秀,像我一样犯了同样的错误。

(道歉,如果我的风格是错误的,这是我堆栈溢出的第一篇文章:))

我有同样的错误,然后我注意到,我有相同的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):