setattr() 没有给 class 成员赋值
setattr() not assigning value to class member
我正在尝试在 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 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 代码中通常不会经常使用前导双下划线(因为通常不鼓励使用它们)。有一些有效的用例(主要是为了避免在子类化时发生名称冲突),但这些用例很少见,因此通常在野外避免名称重整。
我正在尝试在 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 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 代码中通常不会经常使用前导双下划线(因为通常不鼓励使用它们)。有一些有效的用例(主要是为了避免在子类化时发生名称冲突),但这些用例很少见,因此通常在野外避免名称重整。