Как разместить класс Python в нескольких файлах в разных подкаталогах?

Я могу разделить определение класса на несколько файлов, только если они расположены в одном каталоге:

# entrypoint.py

class C(object):

    from ImplFile import OtherMethod

    def __init__(self):
        self.a = 1

# ImplFile.py

def OtherMethod(self):
    print("a = ", self.a)

Если файл ImplFile.py находится в подкаталоге, я получаю сообщение об ошибке:

ModuleNotFoundError: No module named 'OtherMethod'

Как я могу указать, что функция-член определена в этом файле?


Причина, по которой я хочу разделить реализацию на несколько файлов, связана с ее размером, как с точки зрения количества функций-членов, так и с точки зрения их размера.

Почему ты? это ужасная идея.

DeepSpace 06.08.2024 20:44

Предполагая, что у вас есть файл __init__.py, вы можете сделать from xxx.ImplFile import OtherMethod, но не делайте этого.

Tim Roberts 06.08.2024 20:50

Если файл находится в другом подкаталоге, вам необходимо знать, является ли модуль по-прежнему модулем верхнего уровня (в этом случае каталог необходимо добавить в путь поиска) или частью пакета (в этом случае вам необходимо знать полное название модуля). В любом случае, вероятно, это плохая идея — разбрасывать определения методов по нескольким модулям.

chepner 06.08.2024 20:50

большой вопрос заключается в том, как этот код должен запускаться и откуда, что PYTHONPATH ? Я вижу это рассуждение, например. когда вы собираете пакет Python и хотите отделить удобные функции от основной абстракции - но тогда вам просто нужно использовать абсолютные ссылки на импорт.

Georgina Skibinski 06.08.2024 22:14
Почему в 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
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметили DeepSpace и Тим Робертс, то, что вы делаете, является довольно плохой практикой, главным образом потому, что трудно понять, что происходит, когда вы читаете свой код, без каких-либо объяснений или документации.

Если вы действительно настаиваете на продолжении использования того же пути, просто добавьте имя подкаталога перед именем файла в операторе Import:

from <subdirectory>.ImplFile import OtherMethod

Однако если вы хотите продолжить работу с более чистым кодом, лучшим вариантом в вашем случае, вероятно, будет использование Наследование.
Вы можете создать родительский класс с базовыми атрибутами и методами в основном файле, а затем создать дочерние классы в других файлах/подкаталогах с дополнительными методами/атрибутами.

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