【问题标题】:How do I properly import Python classes?如何正确导入 Python 类?
【发布时间】:2019-06-14 17:25:17
【问题描述】:

首先,我的文件夹结构如下:

我的BaseScraper.py 有:

class BaseScraper:
    def __init__(self, page=0, min_code_size=300):
        self.page = page
        self.MIN_CODE_SIZE = min_code_size
    ...

我的JSScraper.py 有:

from BaseScraper import BaseScraper


class JSScraper(BaseScraper):
    def __init__(self):
        super(self).__init__(*args)

而我的jsscraper.py(运行它)有:

from Scraper import JSScraper

scraper = JSScraper.JSScraper(page=0)

所以当我运行jsscraper.py 时,我得到:

ModuleNotFoundError: No module named 'BaseScraper'

我不完全明白我应该如何构建这些项目以正确导入和处理类。任何帮助将不胜感激。

【问题讨论】:

  • 当您在项目的顶层目录中运行python jsscraper.py 时,该目录将被放入sys.path。这意味着在查找 python 包时将搜索当前目录。需要注意的是,当您从其他地方(例如python a/b/c/jsscript.py)调用jsscript.py 时,添加到sys.path 的路径仍然是带有jsscript.py 的目录,而不是您调用python 的目录。这可能会令人困惑。要调试您的问题,请打印 sys.path 的内容并检查 Scraper 目录是否在其中列出的目录之一中。

标签: python class python-import


【解决方案1】:

如何导入

首先你们应该几乎总是使用import X 而不是from X import *。这是由于 X 是如何导入的。

简而言之,如果您使用import X,则会创建一个对X 的引用,您可以访问该引用,通过此引用您可以访问X 的所有属性,例如X.property

如果您使用from X import *,但是您会导入对X 的所有属性的引用。这意味着您可以通过简单地输入property 来访问X 中的属性。这样做的缺点是,如果您已经有一个同名的属性,它将被覆盖。

有关导入的更多信息,您可以阅读this article

问题的解决方法

回到你的问题;要解决导入问题,您应该像这样导入;

jsscraper.py

import Scraper.JSScraper
# Access the scraper via JSScraper.JSScraper()

Scraper.JSScraper.py: (请注意,您忘记在导致错误的导入中添加 Scraper)

import Scraper.BaseScraper
# Access the base scraper via BaseScraper.BaseScraper()

更具可读性的解决方案

对于更易读的解决方案,您还可以使用别名进行导入 比如import X.Y as z,你可以像z.property一样访问它

对您而言,这意味着:

import Scraper.JSScraper as scraper
# Access the scraper via scraper.JSScraper()

Scraper.JSScraper.py: (请注意,您忘记在导致错误的导入中添加 Scraper)

import Scraper.BaseScraper as base
# Access the base scraper via base.BaseScraper()

【讨论】:

    【解决方案2】:

    在您的jsscraper.py 文件中,您写了from BaseScraper import BaseScraper
    (我不是 Python 方面的专家)我想如果你这样写它会起作用
    对于“JSScraper.py”:

    from Scraper.BaseScraper import BaseScraper
    

    因为 Python 认为“from”后面的“BaseScraper”(from BaseScraper ...)是一个目录,而不是你的类所在的文件名。

    好吧,因此您必须将“jsscraper.py”也更改为:

    from Scraper.JSScraper import JSScraper
    

    就像我已经说过的,我想我的解释有点(或真的)错误。但我希望我能帮助你。 (抱歉英语不好)

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 2016-03-19
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多