我正在用Python进行一个数据科学项目,其中许多功能和对象都已重构为类。这些类之一是Universe()
,其中包含我们数据库中的所有名称和属性。可以想象,它很大(需要花费5分钟以上的时间来加载),并且至少在其他两个类中被导入(因此大大降低了其他类的实例化速度)。
我想这样做,以便即使在从其他类中导入时,在运行的内核中该类也仅实例化一次(因此可最大程度地减少数据库交互)。我曾经考虑过使用static
类,但是从我的阅读中,Python开发人员绝对讨厌静态类,并认为它不是Python的。
是否还有其他针对此问题的pythonic解决方案?对于使用数据的所有其他类,您将如何定义一个封装数据并最小化数据库交互的类?
答案 0 :(得分:1)
您可以在模块级别的自己的模块中创建和实例化一个类。该模块将只导入一次,因此该类仅实例化一次。
示例:
文件: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很聪明,可以重新使用已经导入的模块:
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()
没有影响。
但是,既然那样可能会导致混乱(为什么要“实例化”实例?),最好不要这样做。也许只是为了进行初步的快速测试和确定结果的时间。