Python super()行为不可靠

时间:2012-03-15 14:56:58

标签: python inheritance superclass super

出于某种原因,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

5 个答案:

答案 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):