如何正确导入 Python 类?

How do I properly import Python classes?

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

我的 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'

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

在您的 jsscraper.py 文件中,您写了 from BaseScraper import BaseScraper
(我不是这方面的专家Python)我想你这样写就可以了
"JSScraper.py":

from Scraper.BaseScraper import BaseScraper

因为 Python 认为 "BaseScraper" 在 "from" 之后(from BaseScraper ...) 是目录而不是 class 所在的文件名。

嗯,因此您必须将 "jsscraper.py" 也更改为:

from Scraper.JSScraper import JSScraper

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

如何导入

首先你们应该几乎总是使用 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()