如何正确导入Python类?

2024-04-19 15:33:09 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我的文件夹结构如下: enter image description here

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

我还不完全明白应该如何构造这些项目来正确导入和处理类。任何协助都将不胜感激。你知道吗


Tags: frompyimportself文件夹sizeinitdef
2条回答

jsscraper.py文件中,您编写了from BaseScraper import BaseScraper
(我不是Python方面的专家)我想如果你这样写的话,它会工作的
“为”JS刮刀.py“:

from Scraper.BaseScraper import BaseScraper

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

因此,你必须改变你的JS刮刀.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

问题的解决办法

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

JS刮刀.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()

相关问题 更多 >