首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setattr()不给类成员赋值

setattr()不给类成员赋值
EN

Stack Overflow用户
提问于 2016-10-14 02:37:24
回答 1查看 170关注 0票数 0

我试图在Python中设置一个简单的setattr()测试示例,但是它没有为成员分配一个新的值。

代码语言:javascript
复制
class Foo(object):
    __bar = 0
    def modify_bar(self):
        print(self.__bar)
        setattr(self, "__bar", 1)
        print(self.__bar)

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

代码语言:javascript
复制
>>> foo = Foo()
>>> foo.modify_bar()
0
0

有人能解释一下引擎盖下面发生了什么吗。我刚接触蟒蛇,所以请原谅我的基本问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 02:46:09

前面的双下划线调用python 名字残缺

所以:

代码语言:javascript
复制
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不受影响的原因。

代码语言:javascript
复制
class Foo(object):
    _bar = 0
    def modify_bar(self):
        print(self._bar)
        setattr(self, "_bar", 1)
        print(self._bar)

应该能像预期的那样工作。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40034054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档