python'self'未定义

时间:2015-05-17 14:07:14

标签: python sqlite

我收到的错误:

  

文件“database.py”,第6行,in       class data:文件“database.py”,第17行,数据       self.dbcommit()NameError:未定义名称“self”

我的代码:

@Order

3 个答案:

答案 0 :(得分:1)

这是一个缩进问题。 def之后的__init__需要缩进相同的数量,以便Python认为它们是该类的一部分。

尝试:

from sqlite3 import dbapi2 as sqlite

class data:
    def __init__(self,dbname):
        self.con=sqlite.connect(dbname)
    def __del__(self):
        self.con.close()
    def dbcommit(self):
        self.con.commit()
    def createtable(self):
        self.con.execute('create table db(ind,w)')
        self.dbcommit()

e=data('search.db')
e.createtable()

答案 1 :(得分:1)

我相信这几乎肯定是由混合标签和空格引起的。看看你发布的回溯:

File "database.py", line 6, in <module>
    class data:
File "database.py", line 17, in data
    self.dbcommit()
NameError: name 'self' is not defined

这意味着例外情况发生在第17行,正如您已经知道的那样,但这里非常可疑的是它如何到达第17行。您可能希望它到达第17行,因为它正在执行createtable,所以你会想到回溯中的前一行会显示调用e.createtable()

要确切了解发生了什么,需要了解Python如何自己创建类。当Python来到类声明时,它会执行类块中的缩进代码。通常,这将是一堆方法声明(实际上只是函数声明),也许是一些赋值,并且&#34;执行&#34;方法声明只是将该方法添加到当前命名空间。在类块结束时,Python捆绑了命名空间中的所有内容,并使用它们来创建类本身。但是没有什么可以阻止你将任何旧代码放入类块中,并且在执行类定义时它将运行一次。这似乎是我们在这里看到的。

我可以使用以下代码重现您的异常:

from sqlite3 import dbapi2 as sqlite
class data:
    def __init__(self,dbname):
        self.con=sqlite.connect(dbname)
    def __del__(self):
        self.con.close()
    def dbcommit(self):
        self.con.commit()
    def createtable(self):
        self.con.execute('create table db(ind,w)')
    self.dbcommit()
e=data('search.db')
e.createtable()

请注意self.dbcommit()的不同缩进。

那么,即使您的文件中似乎有正确的缩进,为什么会发生这种情况呢?我想你可能有混合标签和空格,并使用一个编辑器,显示标签为4空格缩进,这是现在很常见的。但是,当Python遇到制表符时,它会将它们视为 8-space 缩进。你可能有这个:

from sqlite3 import dbapi2 as sqlite
class data:
TAB>def __init__(self,dbname):
TAB>TAB>self.con=sqlite.connect(dbname)
TAB>def __del__(self):
TAB>TAB>self.con.close()
TAB>def dbcommit(self):
TAB>TAB>self.con.commit()
TAB>def createtable(self):
TAB>TAB>self.con.execute('create table db(ind,w)')
________self.dbcommit()
e=data('search.db')
e.createtable()

但Python看起来像这样:

from sqlite3 import dbapi2 as sqlite
class data:
TAB---->def __init__(self,dbname):
TAB---->TAB---->self.con=sqlite.connect(dbname)
TAB---->def __del__(self):
TAB---->TAB---->self.con.close()
TAB---->def dbcommit(self):
TAB---->TAB---->self.con.commit()
TAB---->def createtable(self):
TAB---->TAB---->self.con.execute('create table db(ind,w)')
________self.dbcommit()
e=data('search.db')
e.createtable()

您可以通过运行python -tt SCRIPTNAME.py来检查是否是这种情况,因为如果遇到混合标签和空格,这将导致Python生成错误。如果是这样,解决方案是用空格替换所有选项卡,并从现在开始坚持使用空格。这是编写Python脚本的推荐方法:https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces

答案 2 :(得分:0)

那应该有用。我的猜测是你在dbcommit的声明中错误拼写self,就像这样

def dbcommit(slef):
    ...