Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果属性为';s not empty或调用方法来填充属性(如果属性为空)_Python - Fatal编程技术网

Python 如果属性为';s not empty或调用方法来填充属性(如果属性为空)

Python 如果属性为';s not empty或调用方法来填充属性(如果属性为空),python,Python,我有一个类,其中一个属性是从web api获取的数据。我不需要每次使用该类时都使用该属性,因此我不希望在实例化该类时调用api,但我也不希望每次访问该属性时都调用该属性。如果属性已填充,如何返回该属性;如果属性未填充,如何调用方法填充该属性?如果在实例化时尝试将属性分配给空列表,则会出现“无法设置属性”错误。如果从init方法中删除该属性,则会出现“最大递归深度”错误 选择1- class Thing: def __init__(self, id, data=None):

我有一个类,其中一个属性是从web api获取的数据。我不需要每次使用该类时都使用该属性,因此我不希望在实例化该类时调用api,但我也不希望每次访问该属性时都调用该属性。如果属性已填充,如何返回该属性;如果属性未填充,如何调用方法填充该属性?如果在实例化时尝试将属性分配给空列表,则会出现“无法设置属性”错误。如果从init方法中删除该属性,则会出现“最大递归深度”错误

选择1-

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方法区分开来。我是说,我的一个错误。谢谢