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