【问题标题】:setattr() not assigning value to class membersetattr() 没有给类成员赋值
【发布时间】:2016-10-14 02:37:24
【问题描述】:

我正在尝试在 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 reflection setattr


    【解决方案1】:

    前导双下划线调用 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
    

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

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

    应该按预期工作。

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

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2012-01-27
      相关资源
      最近更新 更多