用于最小化数据库交互的类?

时间:2019-02-25 16:46:39

标签: python database python-3.x

我正在用Python进行一个数据科学项目,其中许多功能和对象都已重构为类。这些类之一是Universe(),其中包含我们数据库中的所有名称和属性。可以想象,它很大(需要花费5分钟以上的时间来加载),并且至少在其他两个类中被导入(因此大大降低了其他类的实例化速度)。

我想这样做,以便即使在从其他类中导入时,在运行的内核中该类也仅实例化一次(因此可最大程度地减少数据库交互)。我曾经考虑过使用static类,但是从我的阅读中,Python开发人员绝对讨厌静态类,并认为它不是Python的。

是否还有其他针对此问题的pythonic解决方案?对于使用数据的所有其他类,您将如何定义一个封装数据并最小化数据库交互的类?

1 个答案:

答案 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()

没有影响。
但是,既然那样可能会导致混乱(为什么要“实例化”实例?),最好不要这样做。也许只是为了进行初步的快速测试和确定结果的时间。