最小化数据库交互的类?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小化数据库交互的类?相关的知识,希望对你有一定的参考价值。
我正在使用Python进行数据科学项目,其中许多函数和对象已经重构为类。其中一个类是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足够聪明,可以重新使用已导入的模块:
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()
没有影响。 但是,由于这可能导致混淆(为什么“实例化”一个实例?),最好不要这样做。也许只是为了初步的快速测试和结果的时间安排。
以上是关于最小化数据库交互的类?的主要内容,如果未能解决你的问题,请参考以下文章