Python面向对象编程:如何将类所有实例信息存入Pandas DataFrame
汇总SupplyChain类所有实例信息到Pandas DataFrame的实现方案
我正在用Python做面向对象开发,想要把自定义SupplyChain类的所有实例信息汇总到一个Pandas DataFrame里,但目前写的代码只能生成单个实例的DataFrame,没法实现多实例汇总需求,现有代码如下:
class SupplyChain: def __init__(self, projectName, frame_type, NBeams, NColumns, TotalFrameWeight, Dist, RegisterationDate, EarliestPossibleSendTime, LatestSendTime, CurrentDay = 0): self.Name = projectName self.FrameType = frame_type self.TotalBeams = NBeams self.TotalColumns = NColumns self.TotalFrameWeight = TotalFrameWeight self.DistanceToSite = Dist self.DateofRegistration = RegisterationDate self.EarliestDelivery = self.DateofRegistration + EarliestPossibleSendTime self.LatestDelivery = self.DateofRegistration + LatestSendTime self.CurrentDate = CurrentDay self.FrameCost = self.TotalFrameWeight * 1000 * 31000 if self.DistanceToSite <= 1000: self.TransportationCost = self.DistanceToSite * self.TotalFrameWeight * 20000 else : self.TransportationCost = 1000 * TotalFrameWeight * 20000 + ( self.DistanceToSite - 1000 ) * self.TotalFrameWeight * 25000 self.IsDelivered = 0 self.DateofDelivery = 0 self.StorageCost = 0.01 * self.FrameCost * (self.DateofDelivery - self.DateofRegistration) if self.DateofDelivery > self.LatestDelivery : self.DelayCost = 0.05 * self.FrameCost * (self.DateofDelivery - self.LatestDelivery) else: self.DelayCost = 0 self.Profit = self.FrameCost + self.TransportationCost - self.StorageCost - self.DelayCost Columns = ["Name", "Type", "Number of Beams", "Number of Columns", "Total Weight","Distance to Site Location", "Date of Registeration", "Earliest Time to Deliver", "Latest Time to Deliver", "Current Day", "Frame Cost", "Transportation Cost", "Is Delivered?", "Date of Delivery", "Cost of Storage", "Cost of Delay", "Project Profit" ] self.df = pd.DataFrame(columns=Columns) def PandasDataFrame(self): self.df.loc[len(self.df.index)] = [self.Name, self.FrameType, self.TotalBeams, self.TotalColumns, self.TotalFrameWeight, self.DistanceToSite, self.DateofRegistration, self.EarliestDelivery, self.LatestDelivery, self.CurrentDate, self.FrameCost, self.TransportationCost, self.IsDelivered, self.DateofDelivery, self.StorageCost, self.DelayCost, self.Profit] return self.df
解决方案
原代码的问题在于每个实例都单独维护一个DataFrame,无法跨实例汇总数据。可以通过以下方式实现需求:
- 用类变量存储所有创建的
SupplyChain实例 - 提供类方法统一提取所有实例的属性,生成汇总DataFrame
- 可选:将依赖其他属性计算的字段(如
StorageCost、DelayCost)改为@property,确保属性值随依赖项更新而实时计算
修改后的完整代码
import pandas as pd class SupplyChain: # 类变量:存储所有SupplyChain实例 _instances = [] def __init__(self, projectName, frame_type, NBeams, NColumns, TotalFrameWeight, Dist, RegisterationDate, EarliestPossibleSendTime, LatestSendTime, CurrentDay = 0): self.Name = projectName self.FrameType = frame_type self.TotalBeams = NBeams self.TotalColumns = NColumns self.TotalFrameWeight = TotalFrameWeight self.DistanceToSite = Dist self.DateofRegistration = RegisterationDate self.EarliestDelivery = self.DateofRegistration + EarliestPossibleSendTime self.LatestDelivery = self.DateofRegistration + LatestSendTime self.CurrentDate = CurrentDay self.IsDelivered = 0 self.DateofDelivery = 0 # 将当前实例添加到类变量列表 SupplyChain._instances.append(self) @property def FrameCost(self): return self.TotalFrameWeight * 1000 * 31000 @property def TransportationCost(self): if self.DistanceToSite <= 1000: return self.DistanceToSite * self.TotalFrameWeight * 20000 else: return 1000 * self.TotalFrameWeight * 20000 + (self.DistanceToSite - 1000) * self.TotalFrameWeight * 25000 @property def StorageCost(self): if self.DateofDelivery == 0: return 0 return 0.01 * self.FrameCost * (self.DateofDelivery - self.DateofRegistration) @property def DelayCost(self): if self.DateofDelivery > self.LatestDelivery: return 0.05 * self.FrameCost * (self.DateofDelivery - self.LatestDelivery) return 0 @property def Profit(self): return self.FrameCost + self.TransportationCost - self.StorageCost - self.DelayCost @classmethod def to_dataframe(cls): # 定义DataFrame列名 columns = [ "Name", "Type", "Number of Beams", "Number of Columns", "Total Weight", "Distance to Site Location", "Date of Registration", "Earliest Time to Deliver", "Latest Time to Deliver", "Current Day", "Frame Cost", "Transportation Cost", "Is Delivered?", "Date of Delivery", "Cost of Storage", "Cost of Delay", "Project Profit" ] # 提取所有实例的属性值 data = [ [ inst.Name, inst.FrameType, inst.TotalBeams, inst.TotalColumns, inst.TotalFrameWeight, inst.DistanceToSite, inst.DateofRegistration, inst.EarliestDelivery, inst.LatestDelivery, inst.CurrentDate, inst.FrameCost, inst.TransportationCost, inst.IsDelivered, inst.DateofDelivery, inst.StorageCost, inst.DelayCost, inst.Profit ] for inst in cls._instances ] # 生成汇总DataFrame return pd.DataFrame(data, columns=columns)
使用示例
# 创建几个实例 proj1 = SupplyChain("Project A", "Steel", 10, 5, 20, 800, 10, 3, 7) proj2 = SupplyChain("Project B", "Concrete", 15, 8, 35, 1200, 12, 2, 6) proj3 = SupplyChain("Project C", "Steel", 8, 4, 15, 900, 15, 4, 9) # 修改某个实例的交付日期,测试实时计算 proj2.DateofDelivery = 18 proj2.IsDelivered = 1 # 生成汇总DataFrame df = SupplyChain.to_dataframe() print(df)
关键说明
- 类变量
_instances会自动收集所有创建的SupplyChain实例 @property装饰器让计算属性(如成本、利润)在访问时实时计算,避免修改依赖属性后数据不一致- 类方法
to_dataframe()遍历所有实例,提取属性值生成汇总DataFrame,直接调用即可得到所有实例的信息
内容的提问来源于stack exchange,提问作者FZL
相关产品推荐
相关产品推荐

