AttributeError: '模块'对象没有属性'newperson

3 投票
2 回答
4407 浏览
提问于 2025-04-17 12:15

我现在正在学习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 个回答

0

我觉得要进行反序列化(也就是用pickle.load),你必须在你的代码环境中有一个叫做newperson的类。试着在你运行pickle.load的模块里导入这个newperson类。

5

当pickle加载文件时,它会尝试创建newperson的实例,但在第二个程序中并没有定义newperson。为了解决这个问题,你可以新建一个文件newperson.py,里面只包含newperson类的定义。

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

在两个程序中,在导入其他模块或使用pickle之后导入这个类。

from newperson import newperson

另外,你也可以用字典来代替newperson类。

撰写回答