为什么private__var可以改成outsideClass? (Python 3)

Why private __var can change outside Class? (Python 3)

我有以下块:

class Bank:

    def __init__(self, b):
        self.__bal = b

def main():
    myaccount = Bank(2500)
    myaccount.__bal = 8000
    print(myaccount.__bal)

main()

和 PyCharm 打印:8000。 我想问一下如何在 class 之外更改私有变量 __bal

让我告诉你一件关于 Python 3 的事情。

All members in a Python class are public by default. Any member can be accessed from outside the class environment.

因此您可以更改变量。有关 Python 3 class 访问修饰符的更多信息,请转到 here。希望它能澄清你的疑问。

你没有做你认为你在做的事。

用双下划线作为属性前缀执行 "name mangling"。您只是为新属性分配一个值。观察:

class Bank:
    def __init__(self, b):
        self.__bal = b
    def show_bal(self):
        print(self.__bal)

现在,在交互模式下:

>>> b = Bank(23)
>>> b.__bal = 42
>>> b.show_bal()
23

在将某些内容分配给 b.__bal 之前,您还会注意到访问 b.__bal 不起作用 — 因为它尚不存在。实际值仍然可以访问,但它的名称是 "hidden"。没有什么可以阻止您覆盖 "private" 属性(Python 中并不存在的概念):

>>> b._Bank__bal = 99
>>> b.show_bal()
99

如果你想保护属性不被更改,最好的方法是通过 properties,但即使它们也只会保护你的 class 的 public 接口。