Python 在类中有“私有”变量吗?

新手上路,请多包涵

我来自 Java 世界,正在阅读 Bruce Eckels 的 Python 3 Patterns, Recipes and Idioms

在阅读类时,它继续说在 Python 中不需要声明实例变量。您只需在构造函数中使用它们,然后繁荣,它们就在那里。

例如:

 class Simple:
    def __init__(self, s):
        print("inside the simple constructor")
        self.s = s

    def show(self):
        print(self.s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

如果这是真的,那么类 Simple 的任何对象都可以在类之外更改变量 s 的值。

例如:

 if __name__ == "__main__":
    x = Simple("constructor argument")
    x.s = "test15" # this changes the value
    x.show()
    x.showMsg("A message")

在 Java 中,我们学习了公共/私有/受保护变量。这些关键字是有意义的,因为有时您希望类中没有任何人无法访问的类中的变量。

为什么在 Python 中不需要这样做?

原文由 Omnipresent 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

这是文化。在 Python 中,您不会写入其他类的实例或类变量。在 Java 中,如果你 真的 想这样做,没有什么能阻止你做同样的事情——毕竟,你总是可以编辑类本身的源代码来达到同样的效果。 Python 放弃了这种安全性的伪装,并鼓励程序员承担责任。在实践中,这非常有效。

如果出于某种原因想要模拟私有变量,您始终可以使用 PEP 8 中的 __ 前缀。 Python 会破坏变量的名称,如 __foo 以便在包含它们的类之外的代码中不容易看到它们(尽管如果你有足够的决心,你 可以 绕过它,就像你 可以 绕过它一样Java 的保护措施,如果您使用它)。

按照同样的约定, _ 前缀意味着 远离,即使您在技术上没有被阻止这样做。您不会玩弄另一个类的变量,这些变量看起来像 __foo_bar

原文由 Kirk Strauser 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python 中的私有变量或多或少是一种 hack:解释器有意重命名变量。

 class A:
    def __init__(self):
        self.__var = 123
    def printVar(self):
        print self.__var

现在,如果您尝试在类定义之外访问 __var ,它将失败:

 >>> x = A()
>>> x.__var # this will return error: "A has no attribute __var"

>>> x.printVar() # this gives back 123

但是你可以很容易地摆脱这个:

 >>> x.__dict__ # this will show everything that is contained in object x
               # which in this case is something like {'_A__var' : 123}

>>> x._A__var = 456 # you now know the masked name of private variables
>>> x.printVar() # this gives back 456

您可能知道 OOP 中的方法是这样调用的: x.printVar() => A.printVar(x) 。如果 A.printVar() 可以访问 x 中的某些字段,则也可以 在外部 访问该字段 A.printVar() … ‘赋予里面的语句任何特殊的权力。

当涉及编译器时,游戏就不同了( 隐私是编译器级别的概念)。它知道带有访问控制修饰符的类定义,因此如果在编译时不遵守规则,它可能会出错。

原文由 watashiSHUN 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题