Python setattr()没有为类成员赋值

时间:2016-10-14 02:37:24

标签: python reflection setattr

我试图在Python中设置setattr()的简单测试示例,但无法为该成员分配新值。

class Foo(object):
    __bar = 0
    def modify_bar(self):
        print(self.__bar)
        setattr(self, "__bar", 1)
        print(self.__bar)

在这里,我尝试使用setattr(self, "bar", 1)进行变量赋值,但未成功:

>>> foo = Foo()
>>> foo.modify_bar()
0
0

有人可以解释一下发生的事情。我是python的新手,所以请原谅我的基本问题。

1 个答案:

答案 0 :(得分:0)

一个前导的双下划线调用python name-mangling

所以:

class Foo(object):
    __bar = 0  # actually `_Foo__bar`
    def modify_bar(self):
        print(self.__bar)  # actually self._Foo__bar
        setattr(self, "__bar", 1)
        print(self.__bar)  # actually self._Foo__bar

名称修改适用于标识符,而不是字符串,这就是__bar函数调用中的setattr不受影响的原因。

class Foo(object):
    _bar = 0
    def modify_bar(self):
        print(self._bar)
        setattr(self, "_bar", 1)
        print(self._bar)

应该按预期工作。

在大多数python代码中,通常不会经常使用前导双下划线(因为通常不鼓励使用它们)。有一些有效的用例(主要是为了避免在子类化时发生名称冲突),但是那些很少见,通常可以在野外避免名称错误。