我正在尝试为我的项目进行测验,但我收到此错误:AttributeError: 'module' object has no attribute 'question'
。我不明白为什么它认为我的班级是一个属性。
questionbf.py是我制作二进制文件的地方。
quizbf.py是我试图让测验得分正确的地方。
questionbf.py
import pickle
class question:
def __init__(self,a,b,c):
self.q=a
self.an=b
self.o=c
f1=open("Question.DAT","wb")
n=input("Enter no. of Questions ")
for i in range(n):
a=raw_input("Enter Question ")
b=raw_input("Enter Answer ")
c=raw_input("Enter Options ")
s=question(a,b,c)
pickle.dump(s,f1)
f1.close()
quizbf.py
import pickle
print '''Welcome to the revision quiz.'''
print
score=0
w=0
c=0
f1=open("Question.DAT","rb")
try:
while True:
s=pickle.load(f1)
print s.q
print s.o
guess=input("Enter Choice ")
if guess==s.a:
print "Correct!!"
print
score=score+1
c=c+1
elif guess=="exit" or guess=="Exit":
break
else:
w=w+1
print "Incorrect. Better luck next time!!"
print
except EOFError:
f1.close()
print s
print w
错误:
Traceback (most recent call last):
File "C:\Users\RUBY\Desktop\questionbf.py", line 32, in <module>
s=pickle.load(f1)
File "C:\Python27\lib\pickle.py", line 1378, in load
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python27\lib\pickle.py", line 1069, in load_inst
klass = self.find_class(module, name)
File "C:\Python27\lib\pickle.py", line 1126, in find_class
klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'question'
答案 0 :(得分:2)
当你挑选一个类的实例时,类名保存在pickle中,以允许读取程序导入必要的模块并获得对所需类的访问权。不幸的是,你正在挑选其元素的类位于__main__
模块中,这是Python给正在执行的模块的名称。
当你的第二个程序读取pickle时,它会在question
模块中查找__main__
类,这次是第二个程序。所以pickle
抱怨给定的模块(__main__
)不包含必需的类(定义的类是其模块的属性,就像类的方法是类的属性一样)。 / p>
最简单的解决方法是将question
类移动到一个单独的模块,第一个程序显式导入该模块(使用from new_module import question
之类的东西)。然后,您的第二个程序将知道它需要导入new_module
才能访问question
类,它将自动执行(即而无需显式导入它)。
另一种方式(@Doogle在下面的评论中建议)是在尝试unpickle之前将question
类导入主程序的命名空间。