You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'])

原代码错误原因

  1. __new__未返回实例:Python中__new__的职责是创建并返回类的实例,你的代码没有写return super().__new__(cls),导致创建的对象是None,调用interp时自然报AttributeError。
  2. __init__参数错误:__init__的第一个参数必须是self(当前实例),你写了cls,会导致参数不匹配。
  3. 无共享数据存储:原代码读取的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40