在面向对象编程中,我们经常会遇到类中包含其他对象列表(或集合)的场景。例如,一个dataframe_builder类可能管理着一系列columnbuilder对象,每个columnbuilder代表数据框中的一列,并负责生成该列的计算结果。dataframe_builder的职责是将这些列聚合起来,形成一个完整的pandas dataframe。
然而,一个常见的问题是,当Dataframe_Builder内部column_builders列表中的某个ColumnBuilder对象的属性(如日期date)发生变化时,Dataframe_Builder的聚合结果DataFrame(result_df)并不会自动更新。这是因为Python的属性(@property和@setter)机制主要针对属性本身的赋值操作。当您修改列表中的一个元素时,列表本身并没有被重新赋值,因此列表属性的setter方法不会被触发。
考虑以下简化示例,其中Dataframe_Builder_Update类尝试管理column_builders并构建result_df:
import pandas as pd # 假设 ColumnBuilder 是一个外部类,具有 date 属性和 calculated_output class ColumnBuilder: def __init__(self, name, date, data, group=False): self.name = name self._date = date self.data = data self.group = group self.calculated_output = self._calculate_output() @property def date(self): return self._date @date.setter def date(self, new_date): # print(f"Column '{self.name}' date changed from {self._date} to {new_date}") self._date = new_date self.calculated_output = self._calculate_output() # 日期变化时重新计算输出 def _calculate_output(self): return pd.Series([f"Value for {self.name} on {self._date}"], name=self.name) # 原始的 Dataframe_Builder_Update 类结构 class Dataframe_Builder_Update(): def __init__(self, column_builders): self._column_builders = column_builders self.build_dataframe() def build_dataframe(self): self.result_df = pd.DataFrame() for column_builder in self._column_builders: # 确保 calculated_output 是 DataFrame output_df = column_builder.calculated_output.to_frame() if not column_builder.group: self.result_df = pd.concat([self.result_df, output_df.T], axis=0) elif column_builder.group: self.result_df = pd.concat([self.result_df, output_df], axis=1) @property def column_builders(self): return self._column_builders @column_builders.setter def column_builders(self, new_column_builders): # 这个 setter 只有在整个 _column_builders 列表被替换时才会触发 self._column_builders = new_column_builders self.build_dataframe() # 模拟初始化 col1 = ColumnBuilder("A", "2023-01-01", [1]) col2 = ColumnBuilder("B", "2023-01-01", [2], group=True) my_arr = [col1, col2] dataframe_builder_obj = Dataframe_Builder_Update(my_arr) print("--- 初始 DataFrame ---") print(dataframe_builder_obj.result_df) # 尝试更新嵌套对象的属性 [setattr(obj, 'date', '2023-12-29') for obj in dataframe_builder_obj.column_builders] print("\n--- 更改嵌套属性后(未自动更新)---") print(dataframe_builder_obj.result_df) # 预期会更新,但实际上不会 # 显式调用更新方法才能生效 #
以上就是Python中嵌套对象属性变更时的数据框自动更新策略的详细内容,更多请关注知识资源分享宝库其它相关文章!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。