Python中有私有变量吗


Python中有私有变量吗

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

如果由于某种原因想要模拟私有变量,可以始终使用PEP 8中的__前缀。Python破坏了变量的名称,使得它们不容易被包含它们的类外的代码看到(尽管如果你足够坚定,你可以解决它,就像你可以绕过Java的保护,如果你在它工作)。__foo

按照相同的惯例,_前缀意味着即使您没有在技术上阻止这样做,也要远离。你不会玩另一个看起来像__foo或类的变量_bar

实例

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()...毕竟,为了可重用性而创建函数,没有给出内部语句的特殊功能。

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