Использование __setattr__ со словарем внутри класса - PullRequest
0 голосов
/ 06 мая 2020

Я хочу определить такой класс:

class Test:
    _ID = itertools.count()

    def __init__(self):
        self.id = next(self._ID)
        self.__setattr__('_dict', {})


    def __getattr__(self, key):
        return self._dict[key]


    def __setattr__(self, key, value):
        self._dict[key] = value

Каков наилучший подход в этом случае?

1 Ответ

1 голос
/ 06 мая 2020

self.id = вызывает __setattr__ для ключа id. Внутри __setattr__ вы пытаетесь получить self._dict, который запускает __getattr__, поскольку ключ _dict еще не определен, а внутри __getattr__ вы пытаетесь сделать то же самое - получите self._dict, поэтому __getattr__ будет вызывается снова и снова ... до предела рекурсии.

Используйте super() для вызова метода __setattr_ по умолчанию, поэтому ваша реализация __getattr__ не получит self._dict:

class Test:
    _ID = itertools.count()

    def __init__(self):
        super().__setattr__("id", next(self._ID))
        super().__setattr__("_dict", {})

    def __getattr__(self, key):
        return self._dict[key]

    def __setattr__(self, key, value):
        self._dict[key] = value

...