如何将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
相关产品推荐
相关产品推荐

