如何正确导入Python类?

时间:2019-06-14 17:25:17

标签: python class python-import

首先,我的文件夹结构如下: 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'

我不完全了解如何构造这些项目以正确导入和处理类。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

如何导入

首先,您应该始终在rowid上使用import X。这是由于X的导入方式。

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

如果您使用X.property,则导入对X的所有属性的引用。这意味着您只需键入from X import *就可以从X访问属性。不利的一面是,如果您已经拥有一个同名的属性,它将被覆盖。

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

问题解决方案

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

jsscraper.py

property

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

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

更具可读性的解决方案

对于更具可读性的解决方案,您还可以使用别名进行导入  像import Scraper.BaseScraper # Access the base scraper via BaseScraper.BaseScraper() 一样,您可以像import X.Y as z

那样访问

对您来说,这意味着:

z.property

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

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

答案 1 :(得分:1)

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

from Scraper.BaseScraper import BaseScraper

因为Python认为“发件人”(from BaseScraper ...)之后的“ BaseScraper”是目录,而不是类所在的文件名。

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

from Scraper.JSScraper import JSScraper

就像我已经说过的那样,我猜我的解释有点(或者真的)是错误的。但我希望能为您提供帮助。 (对不起,英语不好)