Как правильно импортировать классы Python? - PullRequest
0 голосов
/ 14 июня 2019

Во-первых, моя структура папок выглядит следующим образом: 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 ]

2 голосов
/ 19 июня 2019

Как импортировать

Прежде всего вы почти всегда должны использовать import X сверх from X import *.Это связано с тем, как импортируется X.

Короче говоря, если вы используете import X, существует ссылка, созданная для X, к которой вы можете получить доступ, с помощью этой ссылки вы можете получить доступ ко всем свойствам X, например X.property.

Если вы используете from X import *, однако импортируете ссылки на все свойства X. Это означает, что вы можете получить доступ к свойству из X, просто набрав property.Недостатком этого является то, что если у вас уже есть свойство с таким именем, оно будет перезаписано.

Для получения дополнительной информации об импорте вы можете прочитать эту статью

Решениек проблеме

Возвращаясь к вашей проблеме;Чтобы исправить проблемы с импортом, вы должны импортировать их следующим образом:

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()
1 голос
/ 17 июня 2019

В вашем jsscraper.py файле вы написали from BaseScraper import BaseScraper.(Я не эксперт в Python) Я думаю, это будет работать, если вы напишите это такдля "JSScraper.py":

from Scraper.BaseScraper import BaseScraper

Поскольку Python считает, что «BaseScraper» после «from» (from BaseScraper ...) - это каталог, а не имя файла, в котором находится ваш класс.

Что ж, в результате вы получилиизменить свой "jsscraper.py" на:

from Scraper.JSScraper import JSScraper

Как я уже сказал, я думаю, что мое объяснение немного (или действительно) неверно. Но я надеюсь, что смогу вам помочь. (Извините заплохой английский)

...