【问题标题】:Why private __var can change outside Class? (Python 3)为什么私有 __var 可以在 Class 之外更改? (Python 3)
【发布时间】:2019-10-06 17:25:20
【问题描述】:

我有以下块:

class Bank:

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

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

main()

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

【问题讨论】:

    标签: python-3.x class private


    【解决方案1】:

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

    使用双下划线前缀属性执行"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 不起作用——因为它还不存在。实际值仍然可以访问,但它的名称是“隐藏的”。没有什么可以阻止您覆盖“私有”属性(Python 中并不真正存在的概念):

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

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

    【讨论】:

    • 让我问你更多@L3viathan;在您说 'self.__bal = 3' 的地方,您将 __bal 分配为 int 3。然后,在交互模式下,您调用 'b.= Bank(23)' 但 23 不会分配任何地方。 b.show_bal() 如何返回 23?
    【解决方案2】:

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

    默认情况下,Python 类中的所有成员都是公共的。可以从类环境之外访问任何成员。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2012-02-16
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多