Как импортировать классы во вложенных папках

На Python 3.6

Я хочу организовать свои занятия по папкам.

ClassX в папке Classes

Subclass_of_ClassX во вложенной папке

MyPackage
    -__init__.py
    -someCode.py
    -folder Classes
        -__init__.py
        -ClassX.py
        -Subfolder SubClasses
            -__init__.py
            -Subclass_of_ClassX.py

Subclass_of_ClassX переопределяет элементы (функции и переменные) из ClassX

Возникает вопрос: если я импортирую ClassX в любой проект и получаю любой экземпляр Subclass_of_ClassX, и я хочу использовать любую функцию переопределения, нужно ли мне явно импортировать подкласс?

Или я могу просто импортировать ClassX и абстрагироваться от любого унаследованного класса, используя любой экземпляр подкласса, как если бы это был ClassX?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
108
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если у вас есть экземпляр класса - вам уже не нужно ничего импортировать, потому что он уже был импортирован в каком-то другом месте.

Под «экземпляром класса» вы также подразумеваете любой экземпляр подкласса?

hokisajam 06.06.2018 15:50

Да, я говорю о подклассе - экземпляры уже имеют ссылку на свой класс, поэтому вы не можете создать экземпляр, не импортировав куда-нибудь класс. Вы даже можете получить сам подкласс, не импортируя его, с помощью instance.__class__

Andrey Bondar 06.06.2018 15:57
Ответ принят как подходящий

Если вы откуда-то получаете экземпляр Subclass_of_ClassX, вам вообще не нужно дополнительно импортировать класс. Импорт класса просто делает имя доступным в вашей текущей области (модуле).

Вам нужно импортировать класс или подкласс только тогда, когда вам нужно ...

  • создать новый экземпляр
  • написать подкласс
  • используйте его иначе, как в isinstance(obj, ClassX)

То, что вы описываете, не является способом Pythonic для структурирования пакетов.

В конечном итоге вам придется делать

from mypackage.Classes.ClassX import ClassX

когда ты мог бы сделать с

from mypackage.class_x import ClassX

Если ваша посылка, например, зоопарк, где у вас есть животные и еда, я бы посоветовал поместить животных в одну упаковку, а их продукты - в другую.

  • myzoo/__init__.py (пустой)
  • myzoo/animals/__init__.py (пустой)
  • myzoo/animals/base.py (содержащий ваш базовый класс Animal)
  • myzoo/animals/cats.py (содержащий, например, Lion и Tiger)
  • myzoo/foods/__init__.py (пустой)
  • myzoo/foods/base.py (содержащий ваш базовый класс Food)
  • myzoo/foods/kibbles.py (содержит кусочки для кошек, не то, чтобы они им понравились)

(У вас также может быть один файл для каждого животного / корма, и, вероятно, следует, если вы ожидаете, что они станут большими.)

Другие вопросы по теме