Python类属性检测异常:WeeklyTransactionData的months属性报错
AttributeError: 'WeeklyTransactionData' object has no attribute 'months' 错误原因分析
问题描述
我编写了如下Python代码,定义了WeeklyTransactionData类,在__init__方法中初始化了self.months属性,但调用类中的getMonth方法时,触发了AttributeError错误,提示“'WeeklyTransactionData' object has no attribute 'months'”。
相关代码
class WeeklyTransactionData: def __init__(self, df): self.raw_levels = df['Weekly Consumer Spending Levels'].copy() self.raw_growth = df['Weekly Consumer Spending Growth'].copy() self.standardized_levels = self.level(self.raw_levels.copy()) self.standardized_growth = self.growth(self.raw_growth.copy()) self.lower_levels = self.lower(self.standardized_levels.copy()) self.median_levels = self.med(self.standardized_levels.copy()) self.upper_levels = self.upper(self.standardized_levels.copy()) self.months = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'July': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12} def getMonth(self, entry): # 该函数用于查找Growth表格式日期对应的月份 abridged = entry[-10:] for i in self.months.keys(): if i in abridged: return self.months[i] def growth(self, df): # 清理Growth表数据 last_month = self.getMonth(df.iloc[0][len(df.iloc[0])-1]) print("Cleaning growth sheet") return df.reset_index(drop = True)
注:已删除growth函数中的保密代码块,核心逻辑为getMonth()方法的调用。
错误原因
核心问题是初始化顺序错误:
- 在
__init__方法中,你先调用self.growth(self.raw_growth.copy())初始化self.standardized_growth; growth方法内部会调用getMonth,而getMonth需要访问self.months;- 但
self.months是在__init__的最后一行才赋值的——当__init__执行到调用growth的步骤时,self.months还未被定义,因此getMonth访问self.months时就会抛出AttributeError。
解决办法
调整__init__内的属性赋值顺序,把self.months的定义移到所有会调用getMonth或依赖它的方法之前,确保后续方法执行时self.months已经存在。修改后的__init__示例:
def __init__(self, df): # 先定义self.months,保证后续方法能正常访问 self.months = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'July': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12} self.raw_levels = df['Weekly Consumer Spending Levels'].copy() self.raw_growth = df['Weekly Consumer Spending Growth'].copy() self.standardized_levels = self.level(self.raw_levels.copy()) self.standardized_growth = self.growth(self.raw_growth.copy()) self.lower_levels = self.lower(self.standardized_levels.copy()) self.median_levels = self.med(self.standardized_levels.copy()) self.upper_levels = self.upper(self.standardized_levels.copy())
内容的提问来源于stack exchange,提问作者scerva
相关产品推荐
相关产品推荐

