python - Python 类中有 “private” 变量吗?

标签 python class private

我来自 Java 世界,正在阅读 Bruce Eckels 的 Python 3 模式、食谱和习语

在阅读类时,它继续说在 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 中,我们学习了公共(public)/私有(private)/ protected 变量。这些关键字是有意义的,因为有时您希望类中没有任何人无法访问的类中的变量。

为什么 Python 不需要这样做?

最佳答案

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

如果你出于某种原因想要模拟私有(private)变量,你总是可以使用 PEP 8 中的 __ 前缀。 . Python 会破坏诸如 __foo 之类的变量的名称,以便在包含它们的命名空间之外的代码中不容易看到它们(尽管如果你确定可以绕过它够了,就像您可以在使用 Java 时绕过 Java 的保护)。

按照相同的约定,_ 前缀意味着 _variable 只能在类(或模块)内部使用,即使您在技术上没有被阻止访问它来自其他地方。您不会玩弄其他类的变量,这些变量看起来像 __foo_bar

关于python - Python 类中有 “private” 变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641219/

相关文章:

python - Python 中的 N 维线性插值(使用基本原理索引评估数组)

python - 如何将数据帧转换为具有混合列类型的稀疏矩阵?

java - 用java反射实例化私有(private)内部类

python - 如何在 return 语句中调用另一个本地函数内的本地函数?

python - 杀死Python中的输入

java - 错误: constructor Miclass in class Miclass cannot be applied to given types;

c++ - Qt Override class properties on control deserealization

C++ 成员函数未在我的模板类中声明错误

C# 更改私有(private)字段时如何中断?

.net - 将 .Net 类公开给 COM,同时它具有私有(private)泛型类型成员