我正在做一个数据科学项目,其中许多功能和对象已被重构为类。这些类之一是Universe()
,其中包含我们数据库中的所有名称和属性。可以想象,它是巨大的(加载需要超过5分钟的时间),并且在其他两个类别中进口(从而大大减慢了其他类实例化的速度)。
我想做到这一点,以便在运行的内核中,即使从其他类导入(从而最大程度地减少数据库交互),此类也仅是实例化的。我已经考虑过使用static
类,但是根据我阅读的python开发人员,绝对讨厌静态类,并认为它是非pythonic的。
还有其他关于此问题的Pythonic解决方案吗?您将如何定义一个封装数据并最大程度地减少所有使用其他类的数据库交互的类?
您可以在模块级别创建和实例化类。该模块只会导入一次,因此只有一次实例化。
示例:
文件: uni.py
:
class _Universe:
def __init__(self):
print('init')
self.get_database_info()
def get_database_info(self):
print('db info')
Universe = _Universe()
文件: unia.py
:
import unib
from uni import Universe
文件: unib.py
:
from uni import Universe
执行文件unia.py
建议Universe
类导入两次,但是查看输出(从打印功能),您会看到一次实例化发生一次:Python足够聪明,可以重新使用已导入的模块:p> python unia.py
:
输出:
init
db info
请注意,我正在使用_Universe
,因此可以称为Universe
的类实例,以简化代码更改
如果您的代码在 Universe()
是实例化的位置(uni
模块之外),则可以在某种程度上作弊,并将__call__()
方法添加到_Universe
。尽管从例如universe = Universe()
至Universe
:
class _Universe:
def __init__(self):
print('init')
self.get_database_info()
def get_database_info(self):
print('db info')
def __call__(self):
return self
现在,例如unia.py
,您可以:
import unib
from uni import Universe
universe = Universe()
没有影响。
但是,既然,那么可能会导致混乱(为什么"实例化"一个实例?),最好不要。也许只是为了进行初步快速测试和结果的时间。