AttributeError: Can‘t get attribute ‘xxx‘ on <module ‘__main__‘ from ‘xxx‘

在开发Python学生选课系统时,遇到AttributeError,原因是pickle在反序列化时找不到Student或Course类定义。解决方案包括编写自定义反序列化器或从正确模块导入类。第一种方法是创建一个MyCustomUnpickler类,重写find_class方法来处理__main__模块的情况。第二种方法是使用fromcore.coreimport*导入所有需要的类。
摘要由CSDN通过智能技术生成

在学习python时,开发学生选课系统,期间出现AttributeError: Can't get attribute 'Course' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>报错。

首先看下项目结构

我们是在start.py中启动的项目 

db包下存储了学生、管理员的登录信息(userinfo),课程对象(course_info),学生对象(student_info)

解决方案:

然后我们看下报错代码,当调用get_from_pickle读取student_info或者course_info时,就会出现AttributeError: Can't get attribute 'Student' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>或者AttributeError: Can't get attribute 'Course' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>的报错信息,意思是无法从start模块中找到Student或者是Course的类定义

查阅了相关资料后,第一种方法

可以编写一个客户反序列化器,它知道何时遇到__main__模块并引用真正创建类定义的模块。告诉程序需要从core.core模块中找到类定义,而不是从start模块中

代码如下

import pickle

class MyCustomUnpickler(pickle.Unpickler):

    def find_class(self, module, name):

        if module == "__main__":

            module = "program"

        return super().find_class(module, name)

with open('out.pkl', 'rb') as f:

    unpickler = MyCustomUnpickler(f)

    obj = unpickler.load()

print(obj)

print(obj.name)

第二种方法

start文件导入core模块的方式改为from core.core import *,程序还是会从start模块中找Student和Course的类定义,这样写是在start模块中引用core模块中所有的变量。程序的执行只需写一个main()即可

 

参考资料:

由于原文是英文直译,阅读时可能会有很多不通顺的地方

读取pickle文件时的AttributeError - 第一PHP社区tt

拓展资料:

python:copyreg --- 注册配合 pickle 模块使用的函数_做好自己提升技术的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值