Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2011 17:52:34

rombr
От:
Зарегистрирован: 2011-01-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __getattr__

Есть такой код

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 существует ведь.



Офлайн

#2 Авг. 22, 2011 18:30:40

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __getattr__

Для self._var тоже вызывается __getattr__. Т.е. строчка

return self._var[name]
Преобразуется в:
return  self.__getattr__("_var")



Отредактировано (Авг. 22, 2011 18:33:55)

Офлайн

#3 Авг. 22, 2011 23:47:49

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __getattr__

Присвоение в конструкторе self._var = var преобразовуется в вызов __setattr__, который в классе Foo подменен собственной реализацией. Проблема в том, что метод __setattr__ пустой, а значит никакого присвоения не происходит и аттрибут _var не создается.

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

——

Удали метод __setattr__ и код будет работать.



Отредактировано (Авг. 22, 2011 23:49:10)

Офлайн

#4 Авг. 23, 2011 11:12:42

rombr
От:
Зарегистрирован: 2011-01-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __getattr__

Спасибо! Вчера под вечер мой мозг при поиске ошибке как-то игнорил, что у меня там __setattr__ есть.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version