Python __getattr__行为?在ECLIPSE / PyDev控制台?

时间:2011-01-19 17:00:19

标签: python pydev getattr

以下内容:

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 个答案:

答案 0 :(得分: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__始终会失败。

答案 1 :(得分: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