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的新手,所以请原谅我的初级问题。

前面的双下划线会调用python的名称混淆。

:

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

名称篡改只适用于标识符,而不是字符串,这就是为什么setattr函数调用中的__bar不受影响。

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

应按预期工作。

前导双下划线在大多数python代码中通常不经常使用(因为通常不鼓励使用它们)。有一些有效的用例(主要是为了避免子类化时的名称冲突),但这些用例非常罕见,因此通常会避免名称混淆。

相关内容

  • 没有找到相关文章

最新更新