Python @property识别不到带下划线的_loader属性引发AttributeError问题
问题原因
- 构造方法
__init__内的执行顺序错误:你先执行了self._data = self._load_data(),调用_load_data方法时,方法内部访问了self.loader属性,该属性通过装饰器映射到实例变量self._loader,但此时self._loader还没有完成赋值。 self._loader = loader的赋值操作在加载数据逻辑之后,调用_load_data时self._loader尚未定义,因此触发属性不存在报错。- 你认为Python能识别
self._data是误解:报错发生在self._data赋值的执行过程中,赋值操作还没完成,self._data实际上也没有完成初始化。
解决方法
调换__init__内两行代码的执行顺序,先完成self._loader的赋值,再执行数据加载逻辑即可,修正后的代码如下:
import typing import pandas as pd # 假设implements、DataLoader、GoogleCsvHandler均为你环境中已定义的对象 class Zones(implements(DataLoader)): def __init__(self, loader: GoogleCsvHandler): # 先赋值_loader,再执行加载 self._loader = loader self._data = self._load_data() @property def data(self) -> typing.OrderedDict: return self._data @property def loader(self) -> GoogleCsvHandler: return self._loader def _load_data(self): data = self.loader.load() return data def get_dataframe(self) -> pd.DataFrame: return pd.DataFrame() def validate(self) -> bool: return True
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

