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

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)

关键说明

  1. 类变量_instances会自动收集所有创建的SupplyChain实例
  2. @property装饰器让计算属性(如成本、利润)在访问时实时计算,避免修改依赖属性后数据不一致
  3. 类方法to_dataframe()遍历所有实例,提取属性值生成汇总DataFrame,直接调用即可得到所有实例的信息

内容的提问来源于stack exchange,提问作者FZL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:21