Я прочитал документацию о __init__.py
файлах и некоторые хорошие вопросы здесь, на SO, но я все еще не уверен относительно ее правильного использования.
Context
У меня есть кодсо многими пакетами и подпакетами.Я определил много классов, некоторые из которых мне нужно создать один (и только один) экземпляр для всей пользовательской сессии.Эти новые объекты затем используются в разных частях кода, так что каждый раз, когда я (или пользователь) обновляю данные / информацию в этих объектах, они будут использоваться во всем коде без необходимости что-либо менять.Чтобы быть более понятным, позвольте мне показать вам базовую схему того, о чем я говорю.
Код имеет слишком упрощенную структуру, такую как:
root/
__init__.py
tools/
__init__.py
... (some modules)
aliases.py (which defines the class Aliases)
physics/
__init__.py
... (some modules)
constants/
... (some modules)
constants.py (which defines the class Ctes)
units.py (which defines the class Units)
В коде мне нужноуправлять псевдонимами, единицами и константами.Я нашел способ справиться с этим - создать по одному экземпляру каждого и использовать его во всем коде.С помощью этого метода, я уверен, например, что если псевдоним будет добавлен во время выполнения кода, его можно будет использовать в любом месте кода, поскольку существует только один общий экземпляр псевдонимов.Это то, что мне нужно (то же самое относится и к единицам, и константы между прочим).
Текущее состояние
На данный момент, я думаю, что я делаю это нелучшее.Действительно, я создаю экземпляр, скажем, псевдонимов, сразу после объявления класса, в том же файле:
в root/tools/aliases.py
import ... (stuff
class Aliases(object):
"""The Aliases manager"""
...
ALIASES = Aliases()
И затем в любом файлеМне нужно использовать псевдоним, я делаю:
в any_file.py
(в любом месте кода)
from root.tools.aliases import ALIASES
ALIASES.method1() # possibly in functions or other classes
ALIASES.method2() # ... etc
А для некоторых других классов я даже использую файл __init__.py
в корне кода:
в root/__init__.py
# CTES is the instance of Ctes() created in root/physics/constants/constants.py
from root.physics.constants.constants import CTES
CTES.add(...) # add a new constant that needs to be known
(конечно, CTES не просто хранит некоторые константы, я определяю некоторые методы для их использования, поэтому имеет смыслчтобы они были в этом классе вместо того, чтобы просто определять их как обычные константы Python в модуле)
Вопросы
Мне интересно, правильно ли я это делаю (вероятно, нет).Может быть, лучше использовать файлы __init__.py
и инициировать в нем общие экземпляры.Но тогда это приносит некоторые проблемы (например, циклы зависимости или увеличение использования памяти ...)?Кроме того, как использовать созданные экземпляры в другом месте кода?Примерно так:
в root/tools/__init__.py
import root.tools.aliases as Al
ALIASES = Al.Aliases()
# should I delete the imported module: del Al ??
, а затем в any_file.py
from root.tools import ALIASES
ALIASES.method(...)
Или все эти экземпляры лучше включить в файл (например, root/shared.py
), который я импортирую в root/__init__.py
, так что я уверен, что он инициирован?
Я читал много раз, лучше держать __init__.py
файлы пустыми (что имеет местопрямо сейчас в моем коде, кроме, конечно, root/__init__.py
).Как вы думаете?
Я немного растерялся (вы, вероятно, могли видеть это из того факта, что мне не очень ясно).Любая помощь / совет приветствуется.Я бы хотел избежать любых непитоновых решений или решений, которые могут запутать пользователя или сделать вещи небезопасными.