Форум сайта python.su
0
Есть такой код
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
Офлайн
0
Для self._var тоже вызывается __getattr__. Т.е. строчка
return self._var[name]
return self.__getattr__("_var")Отредактировано (Авг. 22, 2011 18:33:55)
Офлайн
0
Присвоение в конструкторе self._var = var преобразовуется в вызов __setattr__, который в классе Foo подменен собственной реализацией. Проблема в том, что метод __setattr__ пустой, а значит никакого присвоения не происходит и аттрибут _var не создается.
Далее все просто - в строке return self._var аттрибут _var не найден, ибо его нет. А раз не найден - вызывается __getattr__ и так снова и снова.
——
Удали метод __setattr__ и код будет работать.
Отредактировано (Авг. 22, 2011 23:49:10)
Офлайн
0
Спасибо! Вчера под вечер мой мозг при поиске ошибке как-то игнорил, что у меня там __setattr__ есть.
Офлайн