Pythons的AttributeError:'NoneType'对象没有属性'errors'

时间:2012-01-14 01:38:29

标签: python

我知道它已经在这里很多次了,但我找不到适合自己案件的答案 第一:我正在为一个没有哈希等运行的简单数据库系统(至少现在)。现在我卡住了。

import sys
import os

filename = ""
database = ""
path = ""
table = ""

class Nollty:
    returns = 0
    errors = 0

    def __init__(self, filename, database):
        self.filename = filename
        self.database = database
        self.path = self.filename + "databases/" + self.database
        openfile = open(self.path + "/db_required", "r")
        if not openfile.errors:
            self.returns = 1
        if not os.path.exists(self.path + "/db_required"):
            self.returns = 0
        openfile.close();

    def select(self, table):
        errors = 0
        self.table = table
        openfile = open(self.path + "/" + self.table, "r")
        if not openfile.errors:
            errors = 1
        if not os.path.exists(self.path + "/" + self.table):
            errors = 0
        openfile.close();


nollty = Nollty("", "test")
if nollty.returns == 1:
    print "Successfully connected to the database!"

query = nollty.select("aaa_auto")
if query.errors == 0:
    print "Successfully chosen the table!"

错误输出为:

Traceback (most recent call last):
File "/home/spotrudloff/Python/Nollty/nollty.py", line 40, in <module>
if query.errors == 0:
AttributeError: 'NoneType' object has no attribute 'errors'

问题可能是我是PHP程序员,我今天在几个小时内学习了Python(所以我的想法仍然是“PHPy”)。

感谢所有回复。

4 个答案:

答案 0 :(得分:4)

您使用returnserrors作为类变量似乎不是一个好主意。无论您创建了多少Nollty个实例,每个变量都只有一个实例。相反,这样做:

def __init__(self, filename, database):
    self.returns = 0
    self.errors = 0
    # rest of __init__

接下来,使用returns表示返回值似乎也不是一个好主意。在Python中,通常会引发异常来指示构造函数中的问题。这样,调用者就不能通过忘记检查returns来忽略问题。

同样,使用select()中的异常来指示参数的问题。我的建议是消除 returnserrors

您还没有从select返回任何值,这就是query最终成为None的原因(在Python中,None是一个特殊值) 。您要么从select()返回有用的内容,要么在没有返回有用值的情况下将结果分配给任何内容。

答案 1 :(得分:3)

select()不会返回显式值,因此它具有NoneType返回值。更改代码,以便select()返回1或0,具体取决于代码的成功或失败。

答案 2 :(得分:1)

看起来select()没有返回值,因此它默认为NoneType(null)。或者(您可能打算这样做),将查询更改为nollty。

答案 3 :(得分:0)

select方法中的errors变量是局部变量。您需要明确设置类错误变量。另外,正如其他人建议你的select方法没有return语句。从您的代码看起来您​​似乎正在尝试访问nollty的errors变量,但是您在查询变量中检查它,这在逻辑上是无。

根据您的目标,您有两种选择。在select方法返回之前,从select或设置self.errors = errors返回错误。或者如果你愿意,两者都做,如下所示。通常,如果选择失败,您可能会返回False,如果成功则返回True,但这不是必需的。

class Nollty:
    ...
    def select(self,table):
        ...
        self.errors = errors
        return errors

errs = nollty.select("aaa_auto")
if nollty.errors == 0:
    print "Successfully chosen the table!"

##functionally equivalent
#if errs==0:
#    print "Successfully chosen the table!"