Python __getattr__ поведение? IN ECLIPSE / PyDev консоль? - PullRequest
0 голосов
/ 19 января 2011

следующее:

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.

Ответы [ 2 ]

3 голосов
/ 19 января 2011

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

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__.

1 голос
/ 19 января 2011

Этого не происходит:

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
...