Python ';模块';对象没有属性';问题';。是否将类名视为属性?

Python ';模块';对象没有属性';问题';。是否将类名视为属性?,python,python-2.7,class,attributes,Python,Python 2.7,Class,Attributes,我正在尝试为我的项目进行一次测验,但遇到以下错误:AttributeError:'module'对象没有属性'question'。我不明白为什么它认为我的类是属性 questionbf.py是我制作二进制文件的地方 quizbf.py是我努力使测验得分正确的地方 问题bf.py import pickle class question: def __init__(self,a,b,c): self.q=a self.an=b

我正在尝试为我的项目进行一次测验,但遇到以下错误:
AttributeError:'module'对象没有属性'question'
。我不明白为什么它认为我的类是属性

  • questionbf.py是我制作二进制文件的地方

  • quizbf.py是我努力使测验得分正确的地方

问题bf.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()
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
quizbf.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()
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'
回溯(最近一次呼叫最后一次):
文件“C:\Users\RUBY\Desktop\questionbf.py”,第32行,在
s=酸洗负荷(f1)
加载文件“C:\Python27\lib\pickle.py”,第1378行
返回Unpickler(file.load())
加载文件“C:\Python27\lib\pickle.py”,第858行
调度[键](自身)
文件“C:\Python27\lib\pickle.py”,第1069行,装入说明
klass=self.find_类(模块,名称)
文件“C:\Python27\lib\pickle.py”,第1126行,在find\u类中
klass=getattr(mod,name)
AttributeError:“模块”对象没有属性“问题”

当您pickle类的实例时,类名保存在pickle中,以允许读取程序导入必要的模块并访问所需的类。不幸的是,您正在酸洗其元素的类位于
\uuuuu main\uuuu
模块中,这是Python给正在执行的模块的名称

当您的第二个程序读取pickle时,它会在
\uuuuu main\uuuuu
模块中查找
问题
类,这一次是第二个程序。因此,
pickle
抱怨给定模块(
\uuuuuu main\uuuuuu
)不包含所需的类(定义的类是其模块的属性,就像类的方法是该类的属性一样)

最简单的修复方法是将
问题
类移动到一个单独的模块中,您的第一个程序将显式导入该模块(使用类似于new_module import question的
)。然后,您的第二个程序将知道它需要导入
新模块
,以便访问
问题
类,它将自动执行该操作(即无需显式导入)


另一种方式(由@Doogle在下面的评论中建议)是将
question
类导入主程序的名称空间,然后再尝试取消勾选。

我不懂python,但对我来说,这听起来像是无法取消勾选对象,因为类
question
没有定义。1)类应该在python中大写。2) 您是否尝试从问题导入问题
?换句话说,您需要导入
问题
类,以便模块了解it@cricket_007您可能需要创建一个单独的
question.py
文件,其中只包含类定义(然后在两个脚本中导入)。如果不这样做,我怀疑python会再次运行整个
questionbf
脚本。这是一个很好的问题。python和序列化的一个新特性永远不会抓住这个问题。工作得很有魅力。您需要的任何函数/类以及从main中提取的函数/类都应该只在main部分中引用。在超过1.5小时的时间里,这个问题从未引起过争议。反应很好。另外,如果在调用unpickling的python模块的main中导入该类,则可以解决这个问题。这真的很有帮助。很好的一点-注意到了一些小问题,所以我把你的建议作为编辑放进去了-谢谢!我仍然不能这样做。你能给我详细解释一下吗。谢谢。修复quizbf.py最简单的方法是在文件顶部添加来自questionbf import question的
。这样,pickle将找到它期望的类。您的回溯具有误导性:它抱怨来自quizbf.py的一行,但声称是来自questionbf.py的回溯。