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

我来自Java世界并阅读Bruce Eckels的Python 3 Patterns,Recipes和Idioms。

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

例如:

class Simple:
    def __init__(self1, str):
        print("inside the simple constructor")
        self1.s = str
    def show(self1):
        print(self1.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中,您不会写入其他类的实例或类变量。 在Java中,如果你真的想做什么,就不会阻止你做同样的事情 - 毕竟,你总是可以编辑类的来源,以达到相同的效果。 Python放弃了这种安全的伪装,并鼓励程序员负责。 在实践中,这很好地工作。

如果由于某种原因想要模拟私有变量,则可以始终使用PEP 8中的__前缀。Python会像__foo一样__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() 之外访问A.printVar() ...毕竟,函数是为了可重用性而创建的,没有赋予内部语句的特殊权力。

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


正如上面的许多评论所正确提到的那样,我们不要忘记访问修饰符的主要目标:帮助代码用户理解应该改变什么以及不应该改变什么。 当你看到一个私人领域时,你不会惹恼它。 所以它主要是由_和__在Python中很容易实现的语法糖。

链接地址: http://www.djcxy.com/p/4117.html

上一篇: Does Python have “private” variables in classes?

下一篇: Why doesn't the compiler complain when I try to override a static method?