具有双下划线的变量名称的奇怪行为

时间:2016-08-11 11:48:40

标签: python

以下代码显示没有错误。

class Bar():
    pass

class Foo():
    def __init__(self):
        self.__bar = Bar()

    def get_bar(self):
        return self.__bar

foo = Foo()
bar1 = foo.get_bar()

foo.__bar = Bar()
bar2 = foo.get_bar()

assert (bar1 is bar2)

为什么__bar表现得像单身?

1 个答案:

答案 0 :(得分:4)

因为双下划线are magical:Python破坏了这些名称,因此无法从类外部访问它们。

如果您要将示例的最后三行替换为...

foo._Foo__bar = Bar()
bar2 = foo.get_bar()

assert (bar1 is bar2)

...你会看到你期望的行为。