【发布时间】:2012-03-22 14:15:22
【问题描述】:
我已经阅读了关于__init__.py 文件的文档和一些关于 SO 的好问题,但我仍然对它的正确用法感到困惑。
上下文
我有一个包含许多包和子包的代码。我已经定义了许多类,其中一些我需要为整个用户会话创建一个(并且只有一个)实例。这些新对象随后被用于代码的不同部分,因此每当我(或用户)更新此对象中的数据/信息时,它将在所有代码中使用,而无需更改任何其他内容。 为了更清楚起见,让我向您展示我正在谈论的基本方案。
代码结构过于简化,如:
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()
然后,在我需要使用 Aliase 的任何文件中,我都会这样做:
在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/__init__.py 的文件中(例如root/shared.py),以便我确定它已启动?
我读过很多次,最好将__init__.py 文件保留为空(我的代码中现在就是这种情况,当然root/__init__.py 除外)。你怎么看?
我有点迷茫(你可能从我不太清楚的事实中看出这一点)。任何帮助/建议都非常受欢迎。我想避免任何非 Pythonic 解决方案,或可能使用户感到困惑或使事情变得不安全的解决方案。
【问题讨论】:
标签: python module initialization package