Python 如果属性为';s not empty或调用方法来填充属性(如果属性为空)
我有一个类,其中一个属性是从web api获取的数据。我不需要每次使用该类时都使用该属性,因此我不希望在实例化该类时调用api,但我也不希望每次访问该属性时都调用该属性。如果属性已填充,如何返回该属性;如果属性未填充,如何调用方法填充该属性?如果在实例化时尝试将属性分配给空列表,则会出现“无法设置属性”错误。如果从init方法中删除该属性,则会出现“最大递归深度”错误 选择1-Python 如果属性为';s not empty或调用方法来填充属性(如果属性为空),python,Python,我有一个类,其中一个属性是从web api获取的数据。我不需要每次使用该类时都使用该属性,因此我不希望在实例化该类时调用api,但我也不希望每次访问该属性时都调用该属性。如果属性已填充,如何返回该属性;如果属性未填充,如何调用方法填充该属性?如果在实例化时尝试将属性分配给空列表,则会出现“无法设置属性”错误。如果从init方法中删除该属性,则会出现“最大递归深度”错误 选择1- class Thing: def __init__(self, id, data=None):
class Thing:
def __init__(self, id, data=None):
self.id = id
self.data = [] if data is None else data
@property
def data(self):
if self.data:
return self.data
else:
self._get_data_from_api()
return self.data
def _get_data_from_api(self):
return requests.get(url, headers).json()
选择2-
class Thing:
def __init__(self, id):
self.id = id
@property
def data(self):
if self.data:
return self.data
else:
self._get_data_from_api()
return self.data
def _get_data_from_api(self):
return requests.get(url, headers).json()
您可以在初始化为
None
的实例属性中缓存API响应,以便data
属性方法仅在缓存属性为None
时从API检索数据:
class Thing:
def __init__(self, id):
self.id = id
self._data = None
@property
def data(self):
if self._data is None:
self._data = self._get_data_from_api()
return self._data
def _get_data_from_api(self):
return requests.get(url, headers).json()
你的压痕破了;在其他方法中嵌套了很多方法。我想我也可以使用空列表而不是None值,但我的错误是没有在init方法中包含前导下划线,以将其与property方法区分开来。我是说,我的一个错误。谢谢