最小化数据库交互的类?

问题描述 投票:0回答:1

我正在使用Python进行数据科学项目,其中许多函数和对象已经重构为类。其中一个类是Universe(),它包含数据库中的所有名称和属性。你可以想象,它是巨大的(加载需要5分钟以上)并且至少在其他两个类中导入(因此大大减慢了其他类的实例化)。

我想这样做,以便在运行的内核中,即使从其他类导入(因此最小化数据库交互),该类也只实例化一次。我曾经想过使用static类,但是从我读过的内容来看,python开发人员绝对讨厌静态类并认为它是非pythonic的。

还有其他更多的pythonic解决方案来解决这个问题吗?您将如何定义一个封装数据的类,并最大限度地减少使用它的所有其他类的数据库交互?

python database python-3.x
1个回答
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()

没有影响。 但是,由于这可能导致混淆(为什么“实例化”一个实例?),最好不要这样做。也许只是为了初步的快速测试和结果的时间安排。

© www.soinside.com 2019 - 2024. All rights reserved.