Метод __getattribute__
вызывается безоговорочно для поиска всех атрибутов объекта, а не только тех, которые не существуют (что делает __getattr__
). Когда вы делаете self.__foo
в его реализации, вы повторяете, поскольку __foo
- это еще один атрибут, который мы пытаемся найти на объекте.
Чтобы избежать этой проблемы, вам нужно вызвать * вашего родителя * Метод 1007 *, чтобы получить все свои собственные атрибуты внутри метода __getattribute__
:
def __getattribute__(self, attr):
try:
return getattr(super().__getattribute__("_Foo__foo"), attr)
except AttributeError:
super().__getattribute__(attr)
Обратите внимание, что мне пришлось вручную применить искажение имени к атрибуту __foo
, потому что нам нужно передать имя как строка в super().__getattribute__
. Это, вероятно, говорит о том, что вы не должны делать искажения в первую очередь. Лучше всего выбрать имя с одним подчеркиванием.