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

我从爪哇世界来读布鲁斯·埃克尔斯的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中,我们了解了公共/私有/受保护的变量。这些关键字是有意义的,因为有时您希望类之外的任何人都无法访问的类中的变量。

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

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

一只斗牛犬
浏览 820回答 3
3回答

慕慕森

这是文化。在Python中,您不会写入其他类的实例或类变量。在Java中,如果真的希望-毕竟,您可以随时编辑类本身的源代码,以达到同样的效果。Python放弃了安全性的伪装,并鼓励程序员承担责任。在实践中,这是非常好的工作。如果出于某种原因要模拟私有变量,则可以始终使用__前缀Pep 8..Python会损坏变量的名称,如__foo以便在包含它们的类之外的代码中不易看到它们(尽管您能,会,可以如果你有足够的决心,就像你自己一样绕开它能,会,可以绕开Java的保护(如果你努力的话)。按照同样的惯例,_前缀手段即使你在技术上没有被阻止,也要远离。..您不使用其他类的变量,这些变量看起来像__foo或_bar.

白衣非少年

python中的私有变量或多或少是一种黑客:解释器有意将变量重命名。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().毕竟,函数是为可重用性而创建的,里面的语句没有特殊的功能。当涉及编译器时,游戏就不一样了(隐私是编译器级别的概念。)。它了解带有访问控制修饰符的类定义,以便在编译时没有遵循规则时出错。

哔哔one

正如上面的许多注释正确地提到的,我们不要忘记访问修饰符的主要目标:帮助代码的用户理解哪些应该更改,哪些不应该更改。当你看到一个私人领域时,你不会乱搞它。因此,它主要是语法糖,这在Python中很容易由_和_实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python