Python:使用2个py模块时搁置的属性错误

时间:2011-10-09 18:32:45

标签: python shelve

我正在尝试搁置模块,我遇到了一些麻烦。我的目的是让一个模块在第二个模块中调用一个函数,它将修改一个搁架内的文件。我制作了一个原型(下图),它只是试图将变量设置为存储在货架中的东西并打印该对象。

当我尝试这样做时,我收到以下属性错误:

AttributeError: 'module' object has no attribute 'User'

我的猜测是它没有意识到我的'用户'类存在,但我不确定原因。 File1调用与File2在其主函数中执行的功能相同的功能,并且它在该实例中正确工作。我很感激这个问题的任何帮助,我对这个问题感到困惑。

import SE_ex2

SE_ex2.cacheTest()

import shelve

cache_users = shelve.open("usersTest.cache")

class User(object):
    def __init__(self, name, num):
        self.name = name
        self.num = num

    def __str__(self):
        return "Name:{0}, Num={1}".format(self.name, self.num)

def cacheTest():
    obj = cache_users[ "user_red" ]
    print obj

if __name__ == "__main__":
    cacheTest()

#Used for creating the cache for the first time
#    red = User("red", 11)
#    green = User("green", 22)
#    blue = User("blue", 33)
#
#    cache_users['user_red'] = red
#    cache_users['user_green'] = green
#    cache_users['user_blue'] = blue
#    print "DONE"

完整追溯:

Traceback (most recent call last):
  File "C:\Users\akaGrim\My Documents\Aptana Studio 3 Workspace\ShelveTest\SE_ex1.py", line 3, in <module>
    SE_ex2.cacheTest()
  File "C:\Users\akaGrim\My Documents\Aptana Studio 3 Workspace\ShelveTest\SE_ex2.py", line 14, in cacheTest
    obj = cache_users[ "user_red" ]
  File "C:\Python27\lib\shelve.py", line 122, in __getitem__
    value = Unpickler(f).load()
AttributeError: 'module' object has no attribute 'User'

2 个答案:

答案 0 :(得分:2)

修复:

import SE_ex2
from SE_ex2 import User

SE_ex2.cacheTest()

Pickled class需要在命名空间

原因是货架使用pickle,因此它使用User类:

  

使用自己的类时,必须确保该类   被腌制出现在阅读过程的名称空间中   泡菜。只腌制实例的数据,而不是类   定义。类名用于查找要创建的构造函数   unpickling时的新对象。拿这个写的例子   类的实例到文件:

     

引用:http://www.doughellmann.com/PyMOTW/pickle/index.html#problems-reconstructing-objects

答案 1 :(得分:0)

之前我曾遇到类似pickle的麻烦。尝试将User类放在另一个文件中,这样就可以从这两个文件中的同一模块导入它。我认为它已被标记为User,但是当你取消它时,你期望它能够发现SE_ex2.User就是它所谓的用户。它也可以显式导入User类,如

from SE_ex2 import User
import SE_ex2
SE_ex2.cache_test()