Найти - Пользователи
Полная версия: Проблема с __getattr__
Начало » Python для новичков » Проблема с __getattr__
1
rombr
Есть такой код
class Foo(object):
def __init__(self, var):
self._var= var


def __getattr__(self, name):
try:
return self._var[name]
except KeyError:
raise AttributeError()


def __setattr__(self, name, value):
pass

if __name__ == '__main__':
p = Foo({'z': 'value'})
p.z
И он уходит в рекурсию почему-то. Хотя по идее __getattr__ должен вызываться только для несуществующих свойств.
Но здесь-то _var существует ведь.
Carzil
Для self._var тоже вызывается __getattr__. Т.е. строчка
return self._var[name]
Преобразуется в:
return  self.__getattr__("_var")
dimabest
Присвоение в конструкторе self._var = var преобразовуется в вызов __setattr__, который в классе Foo подменен собственной реализацией. Проблема в том, что метод __setattr__ пустой, а значит никакого присвоения не происходит и аттрибут _var не создается.

Далее все просто - в строке return self._var аттрибут _var не найден, ибо его нет. А раз не найден - вызывается __getattr__ и так снова и снова.

——

Удали метод __setattr__ и код будет работать.
rombr
Спасибо! Вчера под вечер мой мозг при поиске ошибке как-то игнорил, что у меня там __setattr__ есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB