Я могу разделить определение класса на несколько файлов, только если они расположены в одном каталоге:
# 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'
Как я могу указать, что функция-член определена в этом файле?
Причина, по которой я хочу разделить реализацию на несколько файлов, связана с ее размером, как с точки зрения количества функций-членов, так и с точки зрения их размера.
Предполагая, что у вас есть файл __init__.py
, вы можете сделать from xxx.ImplFile import OtherMethod
, но не делайте этого.
Если файл находится в другом подкаталоге, вам необходимо знать, является ли модуль по-прежнему модулем верхнего уровня (в этом случае каталог необходимо добавить в путь поиска) или частью пакета (в этом случае вам необходимо знать полное название модуля). В любом случае, вероятно, это плохая идея — разбрасывать определения методов по нескольким модулям.
большой вопрос заключается в том, как этот код должен запускаться и откуда, что PYTHONPATH
? Я вижу это рассуждение, например. когда вы собираете пакет Python и хотите отделить удобные функции от основной абстракции - но тогда вам просто нужно использовать абсолютные ссылки на импорт.
Как отметили DeepSpace и Тим Робертс, то, что вы делаете, является довольно плохой практикой, главным образом потому, что трудно понять, что происходит, когда вы читаете свой код, без каких-либо объяснений или документации.
Если вы действительно настаиваете на продолжении использования того же пути, просто добавьте имя подкаталога перед именем файла в операторе Import:
from <subdirectory>.ImplFile import OtherMethod
Однако если вы хотите продолжить работу с более чистым кодом, лучшим вариантом в вашем случае, вероятно, будет использование Наследование.
Вы можете создать родительский класс с базовыми атрибутами и методами в основном файле, а затем создать дочерние классы в других файлах/подкаталогах с дополнительными методами/атрибутами.
Почему ты? это ужасная идея.