Python类动态存储数据 以类属性形式访问pandas DataFrame
动态生成DataFrame访问属性的实现方案
核心逻辑
- 避免用
dict作为变量名,会覆盖Python内置的字典类型,将数据存储字典重命名为_df_dict - 利用dataclass自带的
__post_init__初始化钩子,在实例创建完成后自动遍历数据字典 - 调用内置方法
setattr(实例对象, 属性名, 属性值),把字典的每个键值对直接绑定为实例属性 - 无需逐个编写重复的访问方法,绑定后直接通过
实例名.属性名即可访问对应DataFrame
完整代码
from dataclasses import dataclass, field import pandas as pd from typing import Dict @dataclass class Dataset: # 数据存储字典,默认内置示例数据,支持实例化时传入自定义字典 _df_dict: Dict[str, pd.DataFrame] = field(default_factory=lambda: { 'df1_id': pd.DataFrame({'col1': [1, 1]}), 'df2_id': pd.DataFrame({'col2': [2, 2]}), 'df3_id': pd.DataFrame({'col3': [3, 3]}) }) def __post_init__(self): # 实例初始化完成后自动执行,批量绑定属性 for df_id, df_content in self._df_dict.items(): # 校验键为字符串类型,避免生成非法属性名 if not isinstance(df_id, str): raise TypeError(f"DataFrame ID必须为字符串,当前类型为{type(df_id)}") setattr(self, df_id, df_content)
使用示例
# 用默认数据实例化 datasets = Dataset() # 直接访问属性,不需要加括号调用方法 print("df1_id内容:") print(datasets.df1_id) # 传入自定义DataFrame字典实例化 custom_data = { 'order_df': pd.DataFrame({'order_id': [1001, 1002], 'pay': [99, 199]}), 'stock_df': pd.DataFrame({'sku': ['a1', 'a2'], 'count': [20, 50]}) } custom_ds = Dataset(custom_data) print("自定义order_df内容:") print(custom_ds.order_df)
注意事项
- 如果不需要支持外部传入自定义字典,也可以把
_df_dict直接定义为类属性,__post_init__里遍历self._df_dict的逻辑不变 - 动态绑定的属性和手动定义的实例属性使用逻辑完全一致,支持赋值、修改等常规操作
- 若需要避免属性被意外修改,可以在绑定后把对应属性设置为只读,常规使用场景下不需要额外处理
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

