Python super()行为不可靠
出于某种原因, super()
方法并不总是按预期行事,select返回:
TypeError('super(type, obj): obj must be an instance or subtype of type)'
我明白错误的含义 。 我不明白为什么它会出现错误。 以下是正在破解的代码片段。 系统中的所有对象都是新的样式对象。
真正有趣的是这个错误并不总是显示出来。 我不知道是什么原因造成的。 Retrieval
的super()
方法传递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):