实例没有属性(python)

时间:2013-08-13 08:51:55

标签: python class attributeerror

我有一个奇怪的问题,可能很容易解决。

我有一个包含__init__executeDictMore方法的类数据库(等等)。

class Database():
    def __init__(self, database, server,login, password ):
        self.database = database
        my_conv = { FIELD_TYPE.LONG: int }
        self.conn = MySQLdb.Connection(user=login, passwd=password, db=self.database, host=server, conv=my_conv)
        self.cursor = self.conn.cursor()

    def executeDictMore(self, query):
        self.cursor.execute(query)
        data = self.cursor.fetchall()
        if data == None :
            return None
        result = []
        for d in data:
            desc = self.cursor.description
            dict = {}
            for (name, value) in zip(desc, d) :
                dict[name[0]] = value
            result.append(dict)
        return result

然后我在db_functions.py文件中实例化这个类:

from Database import Database
db = Database()

我从db_functions函数调用executeDictMore方法:

def test(id):
    query = "SELECT * FROM table WHERE table_id=%s;" %(id)
    return db.executeDictMore(query)

现在出现了奇怪的部分。 如果我导入db_functions并从python控制台调用db_functions.test(id):

import db_functions
t = db_functions.test(12)

它运作得很好。 但是,如果我从另一个python文件做同样的事情,我会收到以下错误:

AttributeError: Database instance has no attribute 'executeDictMore'

我真的不明白这里发生了什么。我不认为我有另一个数据库类干扰。并且我将模块所在的文件夹附加到sys.path中,因此它应该调用正确的模块。

如果有人有想法,那就非常受欢迎了。

4 个答案:

答案 0 :(得分:3)

你的路径中有另一个Database模块或包,而是导入它。

要诊断其他模块的居住地,请添加:

import Database
print Database.__file__

from Database import Database行之前;它会打印模块的文件名。您必须将一个或另一个模块重命名为不冲突。

答案 1 :(得分:1)

如果您想在搜索路径中首先插入({1}},则应插入(不附加):

sys.path

答案 2 :(得分:1)

您至少可以尝试避免SQL注入。 Python提供了这样简洁的方法:

def executeDictMore(self, query, data=None):
    self.cursor.execute(query, data)

def test(id):
    query = "SELECT * FROM table WHERE table_id=%s"
    return db.executeDictMore(query, id)

是这样做的方法。

抱歉,这应该是一个评论,但答案允许更好的格式。我知道它没有回答你的问题......

答案 3 :(得分:0)

我不太确定会出现什么问题,但您可以尝试将数据库对象作为参数传递给函数 db_functions.test(db, 12),db是您的数据库类