我试图在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代码中通常不经常使用(因为通常不鼓励使用它们)。有一些有效的用例(主要是为了避免子类化时的名称冲突),但这些用例非常罕见,因此通常会避免名称混淆。