Python OOP实现类首次创建时读取SQL数据并多对象复用
解决方案
核心思路
用类属性存储全局共享的SQL数据,首次创建对象时触发数据加载,后续所有对象直接复用该类属性的数据。同时修复原代码中__new__和__init__的写法错误。
修正后的data.py代码
import pandas as pd from scipy import interpolate import db # 假设这是你的数据库连接模块 class rate_interp: # 类属性:缓存全局共享的SQL数据,初始为None _prices_df = None def __init__(self, ccy, type1, type2, pricing_date): # 首次创建对象时加载数据库数据 if rate_interp._prices_df is None: db_conn = db.connect(r'C:\Users\user\DataGripProjects\default\identifier.sqlite') rate_interp._prices_df = pd.read_sql('select * from rates_prices', db_conn) db_conn.close() # 及时关闭连接,避免资源泄漏 # 初始化当前对象的专属属性 self.curve_ID = f"{ccy}_{type1}_{type2}" self.pricing_date = pricing_date # 按条件切片数据(注意:这里的curve_family拼接逻辑请根据实际业务调整) curve_family_key = f"{type2}{type1}{ccy}{pricing_date}" self.df_cut = rate_interp._prices_df.loc[rate_interp._prices_df['curve_family'] == curve_family_key] # 创建插值函数 self.interp = interpolate.interp1d(self.df_cut['days'], self.df_cut['LAST_PRICE'])
原代码错误原因
__new__未返回实例:Python中__new__的职责是创建并返回类的实例,你的代码没有写return super().__new__(cls),导致创建的对象是None,调用interp时自然报AttributeError。__init__参数错误:__init__的第一个参数必须是self(当前实例),你写了cls,会导致参数不匹配。- 无共享数据存储:原代码读取的
prices未保存为类属性,无法被后续对象复用。
main.py使用方式不变
from data import rate_interp # 第一个对象创建时触发SQL数据加载 USD_ON_SOFR = rate_interp('USD', 'ON', 'SOFR', '2023-01-26') # 后续对象直接复用已加载的数据 EUR_ON_EONIA = rate_interp('EUR', 'ON', 'EONIA', '2023-01-26') ans = USD_ON_SOFR.interp(45).item() print(ans)
额外优化建议
- 数据库连接使用后立即关闭,避免长期占用资源。
- 类属性前加下划线(如
_prices_df),标记为内部属性,不建议外部直接修改。 - 如果是单线程脚本,当前方案足够;若涉及多线程/进程,可添加锁机制保证数据加载的原子性。
内容的提问来源于stack exchange,提问作者gangstarrrrr
相关产品推荐
相关产品推荐

