一尘不染

Python在类中是否有“私有”变量?

python

我来自Java世界,正在阅读Bruce Eckels的Python 3 PatternsRecipesIdioms

在阅读类时,它继续说在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中不需要这样做?


阅读 307

收藏
2020-02-12

共1个答案

一尘不染

这是文化的。在Python中,你无需写入其他类的实例或类变量。在Java中,如果你真的想做的话,什么也不能阻止你做同样的事情-毕竟,你始终可以编辑类本身的源代码以达到相同的效果。Python放弃了这种安全性的幌子,并鼓励程序员负责。实际上,这非常好用。

如果出于某种原因要模拟私有变量,则始终可以使用PEP 8中的__前缀。Python会像这样对变量的名称进行修饰,以使它们在包含它们的类之外的代码中不易被看到(尽管只要有足够的决心,你就可以解决它,就像你可以使用它来避开Java保护一样)。__foo

按照相同的约定,即使没有从技术上阻止你这样做,_前缀也意味着不要离开。你不会在其他类的看起来像__foo或的变量上玩耍_bar

2020-02-12