如何在 Jupyter Notebook 中正确导入自定义类

9次阅读

如何在 Jupyter Notebook 中正确导入自定义类

jupyter notebook 文件(`.ipynb`)本身不能被直接作为模块导入;必须将类定义移至 `.py` 文件中,再通过标准 python 导入机制使用。

在 Jupyter 中开发时,常会误以为 .ipynb 文件像普通 python 模块一样可被 import —— 但实际上,Jupyter Notebook 是基于 jsON 的交互式文档格式,并非合法的 Python 模块。当你执行 from rentalcar import rentalcar 时,Python 解释器会在 sys.path 中查找名为 rentalcar.py 的模块,而不会识别或加载 rentalcar.ipynb。

✅ 正确做法如下:

  1. 将类导出为 .py 文件
    打开 rentalcar.ipynb,复制其中 class rentalcar: 及其依赖代码(如导入语句、辅助函数等),粘贴到新文件 rentalcar.py 中,并保存在与 customer.ipynb 同一目录下(或确保该路径已加入 sys.path)。

    # rentalcar.py from datetime import datetime  class rentalcar:     def __init__(self, model, daily_rate):         self.model = model         self.daily_rate = daily_rate      def calculate_cost(self, days):         return self.daily_rate * days
  2. 在 customer.ipynb 中正常导入

    from datetime import datetime from rentalcar import rentalcar  # ✅ 现在可成功导入  class Customer:     def __init__(self, name, rental_company):         self.name = name         self.rental_company = rental_company  # 示例使用 car = rentalcar("Toyota Camry", 45.0) print(f"3-day rental cost: ${car.calculate_cost(3)}")

⚠️ 注意事项:

  • 确保 rentalcar.py 与 customer.ipynb 位于相同工作目录(可通过 !pwd 或 os.getcwd() 查看);
  • 若修改了 rentalcar.py,在 Jupyter 中需重新运行 import 语句(推荐配合 importlib.reload 避免内核缓存问题):
    import importlib import rentalcar importlib.reload(rentalcar)
  • 不建议用 %run rentalcar.ipynb 替代导入——它仅执行代码,不创建可复用的模块命名空间,且无法跨 notebook 共享类定义。

? 总结:Jupyter 是探索和演示工具,而模块化开发应遵循 Python 工程规范——将可复用逻辑封装进 .py 文件。这是兼顾交互性与可维护性的最佳实践。

text=ZqhQzanResources