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

如何将Python函数转为功能相同的类?转换后代码报错求助

类重构错误排查与修复

原函数代码

def eachList(index):
    Series=df_ideal.iteritems()
    bigList = []
    for (columnName,item) in Series:
        bigList.append(item)
    return bigList[index]
def isResult(listing):
    mylist=[]
    for i in range(len([column_name for column_name in df_ideal])):
        result = map(lambda x:x*x,residual(listing,eachList(i)))
        Sum = int(sum(result))
        mylist.append(Sum)
    return(mylist)     

转换后存在错误的类代码

Task1类

class Task1:
    
    def __init__(self,train,ideal):
        self.train = train
        self.ideal = ideal
        
    def __str__(self):
        return self.ideal[index]
    
    def residual(self,lst1,lst2):
        self.subtracted = []
        for item1,item2 in zip(lst1,lst2):
            self.subtracted.append(item1-item2)
        return self.subtracted
    
    def eachList(self,index):
        Series=df_ideal.iteritems()
        self.bigList = []
        for (columnName,item) in Series:
            self.bigList.append(item)
        return self.bigList[index]

Resultant继承类

class Resultant(Task1):
    def __init__(self,train,ideal):
        super().__init__(train,ideal)
      
    def isResult(self,listing):
        mylist=[]
        for i in range(len([column_name for column_name in df_ideal])): 
            result = map(lambda x:x*x,Task1.residual(listing,Task1.eachList(i)))
            Sum = int(sum(result))
            mylist.append(Sum)
        return(mylist)  

错误点分析

  • 硬编码全局变量df_ideal:类初始化时已传入ideal作为实例属性,但代码仍直接依赖全局df_ideal,破坏封装性,且无法复用类实例。
  • 实例方法调用方式错误:Resultant.isResult中直接通过类名调用Task1.residual和Task1.eachList,这两个是实例方法,必须通过self调用,否则会因缺少self参数报错;同时eachList的参数传递逻辑错误。
  • __str__方法存在未定义变量:__str__中使用的index既不是实例属性也未传入,调用时会触发NameError。
  • 不必要的实例属性存储:residual方法将临时计算的列表绑定到self,该列表仅为临时结果,无需作为实例属性保存,会造成状态冗余。

修复后的代码

修正后的Task1类

class Task1:
    def __init__(self, train, ideal):
        self.train = train
        self.ideal = ideal

    def __str__(self):
        # 返回有意义的类标识,避免未定义变量
        return f"Task1 instance (train shape: {self.train.shape}, ideal shape: {self.ideal.shape})"

    def residual(self, lst1, lst2):
        # 使用局部变量存储临时结果,无需绑定到实例
        subtracted = []
        for item1, item2 in zip(lst1, lst2):
            subtracted.append(item1 - item2)
        return subtracted

    def eachList(self, index):
        # 使用实例属性self.ideal替代全局df_ideal
        bigList = []
        for columnName, item in self.ideal.iteritems():
            bigList.append(item)
        return bigList[index]

修正后的Resultant类

class Resultant(Task1):
    def __init__(self, train, ideal):
        super().__init__(train, ideal)

    def isResult(self, listing):
        mylist = []
        # 通过实例属性获取列数,替代全局变量
        column_count = len(self.ideal.columns)
        for i in range(column_count):
            # 通过self调用父类实例方法
            residuals = self.residual(listing, self.eachList(i))
            result = map(lambda x: x*x, residuals)
            sum_result = int(sum(result))
            mylist.append(sum_result)
        return mylist

使用示例

# 假设train_df和ideal_df是你的DataFrame实例
result_obj = Resultant(train_df, ideal_df)
# 传入目标列表调用方法
output = result_obj.isResult(your_listing_data)
print(output)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:37