我收到的错误:
文件“database.py”,第6行,in class data:文件“database.py”,第17行,数据 self.dbcommit()NameError:未定义名称“self”
我的代码:
@Order
答案 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):
...