2011-01-19 3 views
0

Следующая:Python __getattr__ поведение? В консоли ECLIPSE/PyDev?

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute' 
      return self.__dict__[attr] 

возвращается:

obj = A() 
obj.foo 
Assigned attribute 
Assigned attribute 
Assigned attribute 
'Attribute set to string' 

Где волшебство происходит?

(я на 2.6.6)

Редактировать: Спасибо за отзыв. Действительно, эта проблема не может быть воспроизведена из самой командной строки Python. Похоже, что это происходит только при использовании консоли в Eclipse/PyDev.

+4

Для меня, он печатает только 'Assigned attribute' один раз. –

+2

Я не могу воспроизвести это с помощью python 2.5, 2.6 или 3.1. Попробуйте «print» искать «attr» после строки def \ _ \ _ getattr \ _ \ _, чтобы увидеть, что нужно. –

+0

Хорошо, это странно. Он три раза печатался в консоли Eclipse, но с использованием интерпретатора из командной оболочки он ведет себя правильно. –

ответ

1

Это не бывает:

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute' 
      return self.__dict__[attr] 

obj = A() 
print obj.foo 

дает:

Assigned attribute 
Attribute set to string 

__getattr__ вызывается только тогда, когда атрибут не существует! Так try .. except будет идти в каждый раз, кроме ...

Это эквивалентно:

class A(object): 
    def __getattr__(self, attr): 
     val = 'Attribute set to string' 
     setattr(self, attr, val) 
     print 'Assigned attribute' 
     return val 
3

У меня есть немного другая версия вашего кода, которая может помочь.

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute', attr 
      return self.__dict__[attr] 

>>> o = A() 
>>> o.foo 
Assigned attribute foo 
'Attribute set to string' 

Я не знаю, как вы видите «Назначенный атрибут» более одного раза. Это с Python 2.6.6.

Стоит отметить, что try всегда терпит неудачу, если вызывается __getattr__.

Смежные вопросы