Доброго времени суток!
Имеется подобная структура проекта:
myproject
api
product.py
bitrix.py
storage.py
main.py
Каждый файл внутри папки
api имеет классы-заглушки вида
Product,
Bitrix,
Storage.
Вариант импорта 1 (нерабочий)Импорт:
from api import *
products = Product()
Выхлоп:
Traceback (most recent call last):
File "C:\Git\xanalyze\main.py", line 3, in <module>
products = Product()
NameError: name 'Product' is not defined
Но если судить по stackoverflow, то это должно работать. Но увы.
Вариант импорта 2 (нерабочий)Импорт:
from api import *
products = api.Product()
Выхлоп:
Traceback (most recent call last):
File "C:\Git\xanalyze\main.py", line 3, in <module>
products = api.Product()
NameError: name 'api' is not defined
Вариант импорта 3 (нерабочий)Импорт:
import api
products = api.Product()
Выхлоп:
Traceback (most recent call last):
File "C:\Git\xanalyze\main.py", line 3, in <module>
products = api.Product()
AttributeError: module 'api' has no attribute 'Product'
Вариант импорта 4 (нерабочий)Импорт:
import api
products = Product()
Выхлоп:
Traceback (most recent call last):
File "C:\Git\xanalyze\main.py", line 3, in <module>
products = Product()
NameError: name 'Product' is not defined
Вариант импорта 5 (рабочий)Импорт:
from api import product, bitrix, storage
products = product.Product()
Работает.
С одним нюансом.
Добавим импорт внутри модуля:
# product.py
import bitrix
Выхлоп:
Traceback (most recent call last):
File "C:\Git\xanalyze\main.py", line 1, in <module>
from api import product, storage
File "C:\Git\xanalyze\api\product.py", line 3, in <module>
import bitrix
ModuleNotFoundError: No module named 'bitrix'
Задача состоит в том, чтобы обеспечить максимально простой доступ к классам.
Объявление 1 (идеально)product = api.Product()
Объявление 2 (идеально)product = Product()
Объявление 3 (нежелательно)product = product.Product()
А все остальные действия, не связанные с классом
Product должны быть скрыты. Т.е. здесь классы
Bitrix и
Storage выступают больше для логического разделения кода. Очень важно избежать нагромождения в виде создания каждого экземпляра класса в
main.py. Вопрос даже не в нагромождении. Итоговая реализация в мейн вообще не должна касаться других классов, кроме
Product. Всё остальное должно происходить под капотом внутри
Product.
Так же готов послушать не только способы решения данной проблемы, но и по подходу к структуризации в целом.
Каждый объект класса
Product представляет собой в буквальном смысле какой-то продукт, с уникальными полями (
name,
uuid и т.д.)
Класс
Bitrix и
Storage не нуждаются в объектах вообще (синглтон? статика?) и выполняют роль получения данных с "Моего Склада" и "Битрикса".
В итоге это всё агрегируется в нечто такое:
print (product[0].name) # "Наименование такое-то"
По сути, я бы мог поместить всё в один файл, или даже несколько, но при этом не вкладывая их в отдельную папку
api, но не нахожу этот способ достаточно приемлемым.
Благодарю за любую помощь заранее!