属性错误:'module'对象没有属性'newperson'。

3

我是一名正在学习Python编程的初学者。目前我在文件练习中遇到了困难(这些都是我需要完成的设置任务,而不是我想做的任何事情。不幸的是,这也意味着我可能无法使用任何对我来说复杂的快捷方式)。

我目前使用的是Python 3.2.2。

我需要两个不同的程序。一个是输入用户键入的内容(姓名和出生日期),并将其放入列表记录中并将其写入二进制文件。另一个是读取该文件并使用填充打印成表格。

代码:

第一个

    import pickle

class newperson():
    def __init__(self):
        self.name = ""
        self.dob = ""

stop = False
people = []
print("When you want to stop just hit enter")
count = 0

while stop == False:
    name = input("Please Enter the name: ")
    if len(name) == 0:
        stop = True
    else:
        people.append(newperson())
        people[count].name = name
        people[count].dob = input("Please enter their DOB: ")
        count = count + 1

file = open("ex9.4.dat", "wb")
pickle.dump(people,file)
file.close()

第二点:

import pickle

myfile = open("ex9.4.dat", "rb")

people = pickle.load(myfile)

print("{0:<15}{1}".format("Name","DOB"))
for item in people:
    print("{0:<15}{1}".format(item.name,item.dob))

问题在于当我试图运行第二个程序时,出现了以下错误:
AttributeError: 'module' object has no attribute 'newperson'

    people = pickle.load(myfile)

很不幸,当我在寻找其他问题的答案时,要么没有解决方案可用,要么不适用于我,或者大多数解决方案都超出了我的理解范围。

我做错了什么?

提前感谢您的帮助。

2个回答

5
当 pickle 加载文件时,它试图创建 `newperson` 实例,但是在第二个程序中没有定义 `newperson`。要解决这个问题,您可以创建一个新文件 `newperson.py`,只包含类的定义。
# newperson.py
class newperson():
    def __init__(self):
        self.name = ""
        self.dob = ""

在两个程序中,导入或pickle后导入类:

from newperson import newperson

或者,您可以使用字典来代替newperson类。


谢谢 :) 这解决了问题。我会记住使用额外的文件和引用字典,但是我还没有真正开始使用它们(我是一个非常初级的学习者),所以现在我只会重复这个类。再次感谢 :) - PCJonathan

0
我认为要反序列化(即pickle.load),你必须在命名空间中有类newperson。请尝试将类newperson导入到运行pickle.load的模块中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接