Jupyter Notebook调用外部类时displayTest方法报错原因排查
问题描述
在Jupyter Notebook中调用外部类DataSet时出现异常:为测试新增了两个逻辑完全一致的方法dataSet_description和displayTest,前者可正常执行并返回结果,后者却抛出AttributeError,提示DataSet对象没有displayTest属性。已多次保存类文件和Jupyter文件,重启内核后问题仍存在。
类文件ClassObject_1.py代码:
class DataSet: def __init__(self, slv_tuple, tec_name,projectID, sampleID): self.slv_tuple=slv_tuple self.tec_name=tec_name self.projectID=projectID self.sampleID=sampleID # function1 : 可正常运行 def dataSet_description(self): return "{} {} {} {}".format(self.slv_tuple, self.tec_name, self.projectID, self.sampleID) # function 2: 无法运行 def displayTest(self): return "{} {} {} {}".format(self.slv_tuple, self.tec_name, self.projectID, self.sampleID)
Jupyter Notebook代码:
from ClassObject_1 import DataSet ds_1=DataSet(slv_tuple, 'test', projectID, sampleID) # 无报错 print(ds_1.dataSet_description()) # 输出:('1,2,3',) test P12345678 S12345678 # 报错 print(ds_1.displayTest()) # 错误信息:AttributeError: DataSet object has no attribute 'displayTest'
可能的原因及解决方法
- 缩进不符合Python规范:Python依靠缩进区分代码块,若
displayTest方法的缩进级别和类DataSet的缩进不一致(比如比__init__方法缩进少),会导致该方法不属于类的成员,而是类外部的独立函数。检查类文件中该方法的缩进,确保它和dataSet_description、__init__的缩进一致,都属于DataSet类内部。 - 类文件路径不匹配:确认Jupyter当前工作目录和
ClassObject_1.py所在目录一致。可在Notebook中执行import os; print(os.getcwd())查看当前工作目录,若类文件在其他路径,要么把类文件移到当前工作目录,要么把类文件所在路径添加到Python环境变量中。 - 字节码缓存残留:Python会生成
.pyc缓存文件保存编译后的字节码,若缓存未更新,导入的仍是旧版本类定义。找到类文件所在目录下的__pycache__文件夹,删除其中的ClassObject_1.cpython-*.pyc文件,再重启Jupyter内核重新导入。 - 模块未重新加载:若之前已导入过
ClassObject_1模块,即使修改了类文件,内存中的模块定义不会自动更新。可在Notebook中执行from importlib import reload; reload(ClassObject_1)重新加载模块,再重新实例化DataSet对象进行测试。
内容的提问来源于stack exchange,提问作者ApisMel
相关产品推荐
相关产品推荐

