我正在尝试搁置模块,我遇到了一些麻烦。我的目的是让一个模块在第二个模块中调用一个函数,它将修改一个搁架内的文件。我制作了一个原型(下图),它只是试图将变量设置为存储在货架中的东西并打印该对象。
当我尝试这样做时,我收到以下属性错误:
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'
答案 0 :(得分:2)
修复:
import SE_ex2
from SE_ex2 import User
SE_ex2.cacheTest()
原因是货架使用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()