为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只斗牛犬 2019-06-18 13:39:46
我从爪哇世界来读布鲁斯·埃克尔斯的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在类中有“私有”变量吗?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

这是文化。在Python中,您不会写入其他类的实例或类变量。在Java中,如果真的希望-毕竟,您可以随时编辑类本身的源代码,以达到同样的效果。Python放弃了安全性的伪装,并鼓励程序员承担责任。在实践中,这是非常好的工作。

如果出于某种原因要模拟私有变量,则可以始终使用__前缀Pep 8..Python会损坏变量的名称,如__foo以便在包含它们的类之外的代码中不易看到它们(尽管您能,会,可以如果你有足够的决心,就像你自己一样绕开它能,会,可以绕开Java的保护(如果你努力的话)。

按照同样的惯例,_前缀手段即使你在技术上没有被阻止,也要远离。..您不使用其他类的变量,这些变量看起来像__foo_bar.


查看完整回答
反对 回复 2019-06-18
?
白衣非少年

TA贡献1155条经验 获得超0个赞

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

当涉及编译器时,游戏就不一样了(隐私是编译器级别的概念。)。它了解带有访问控制修饰符的类定义,以便在编译时没有遵循规则时出错。


查看完整回答
反对 回复 2019-06-18
?
哔哔one

TA贡献1854条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 819 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信