Подкласс Python не может импортировать суперкласс из суперкласса - PullRequest
0 голосов
/ 04 января 2019

Прежде всего, очень возможно, я могу совершить ужасную ошибку. Но поехали!

Мой суперкласс (project / src / mlbase.py)

from preprocessing import PreProcessing

class MLBase:
  preProcessing = None

  def __init__(self,preprocessingOptions):
    self.preProcessing = PreProcessing(preProcessingOptions)
    # and more stuff here...

Мой подкласс (project / src / preprocessing.py)

from mlbase import MLBase
class PreProcessing(MLBase):
  def __init__(self,options):
     #processing options here... 
     pass 

Мой скрипт, который создает все экземпляры (project / main.py)

from src.mlbase import MLBase

mlb = MLBase(preProcessingOptions = {})

Dirs

  """

  project
  |
  + src
    |
    + mlbase.py
    |
    + preprocessing.py 
  |
  + main.py

  """

Как видите. Целью является создание экземпляров подклассов из суперкласса. Но я получаю следующую ошибку, когда src/preprocessing.py модуль пытается импортировать MLBase класс из src.mlbase.py:

ImportError: невозможно импортировать имя MLBase

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Решением был импорт класса PreProcessing с использованием from preprocessing import PreProcessing внутри метода конструктора! Я не знаю почему! Мне бы очень хотелось это понять!

В модуле mlbase:

class MLBase:
    def __init__(self,preProcessingOptions):
        from preprocessing import Preprocessing
        # more stuff

В модуле предварительной обработки

from mlbase import MLBase

class PreProcessing(MLBase):
    def __init__(self,preProcessingOptions):
        # more stuff

Слишком странно для меня!

0 голосов
/ 04 января 2019

Это просто маленькая опечатка. Вы объявили class MBase, но попытались импортировать MLBase. Все, что вам нужно сделать, это изменить файл суперкласса так:

from preprocessing import PreProcessing

class MLBase: #Note that it's "MLBase", not "MBase"
  preProcessing = None

  def __init__(self,preprocessingOptions):
    self.preProcessing = PreProcessing(preProcessingOptions)
    # and more stuff here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...