如何正确导入 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()
首先,我的文件夹结构如下:
我的 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()