'模块'对象没有属性'问题'。类名被认为是属性?

时间:2016-07-30 21:40:36

标签: python python-2.7 class attributes

我正在尝试为我的项目进行测验,但我收到此错误: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'

1 个答案:

答案 0 :(得分:2)

当你挑选一个类的实例时,类名保存在pickle中,以允许读取程序导入必要的模块并获得对所需类的访问权。不幸的是,你正在挑选其元素的类位于__main__模块中,这是Python给正在执行的模块的名称。

当你的第二个程序读取pickle时,它会在question模块中查找__main__类,这次是第二个程序。所以pickle抱怨给定的模块(__main__)不包含必需的类(定义的类是其模块的属性,就像类的方法是类的属性一样)。 / p>

最简单的解决方法是将question类移动到一个单独的模块,第一个程序显式导入该模块(使用from new_module import question之类的东西)。然后,您的第二个程序将知道它需要导入new_module才能访问question类,它将自动执行(而无需显式导入它)。

另一种方式(@Doogle在下面的评论中建议)是在尝试unpickle之前将question类导入主程序的命名空间。