Python 私有变量没有错误

No error for Python private variable

我在使用 python 时遇到了一个奇怪的问题。考虑以下代码:

class Foo:
    __bar=None

foo=Foo()
foo.bar=10
print(foo.bar)

我想我应该在这里得到一个错误。但是我得到的输出是 10。即使我将代码更改为:

,我也会得到相同的输出
foo=Foo()
foo.__bar=10
print(foo.__bar)

有人可以解释为什么我在这里没有收到错误消息吗?另外我应该怎么做才能得到错误? 编辑以进一步说明:

class Foo:
    def __init__(self):
        self.__bar=10
    def get_bar(self):
        return self.__bar

foo=Foo()
foo.__bar=20
print(foo.__bar)
print(foo.get_bar())

谁能解释一下为什么我得到的答案是 20 和 10?我以为我会在尝试访问 class 之外的私有实例变量时出错。感谢您的帮助。

首先,您应该阅读相关问题的答案。

其次,不要混淆 class-成员和实例成员。您对 class Foo 的定义包括一个名为 __bar 的 class 成员,但分配给 foo.__bar 会添加一个 实例成员 掩盖了它(而不是覆盖它)。这些是不同的东西。

现在,当您从 "outside" 分配(或通常访问)前导双下划线属性时(在您的示例中,使用 foo.__bar),名称不会被破坏,一切都没有额外的魔法。但是,访问前导双下划线属性的标准方法是从 class 的方法内部(使用 self.__bar),这就是魔法发生的时候。

演示:

class Foo(object): pass

f = Foo()
foo.__bar = 10
foo.__bar
=> 10
foo.__dict__.keys()
=> dict_keys(['__bar'])

class Foo(object):
    def __init__(self):
       self.__bar = 10

foo = Foo()
foo.__dict__.keys()
=> dict_keys(['_Foo__bar'])  # mangaled!
foo.__bar  # cannot access from "outside"
=> AttributeError