Python 类的私有成员

大家都知道,一个类的私有成员只能在其所在的类里能够访问,而在外部是不行的。比如 C++ 或者 Java 的 private 关键字就是用来声明类的私有成员的,如果一个属性或者方法被 private 声明,那么这个成员就只能在类里面才能直接使用,这样做的目的是为了封装。和很多面向对象的语言一样,Python 也支持类的私有成员的使用,不过有些差别。

然后在终端下测试

上面的结果与预期相符,但是

这就有些神奇了。原来 Python 里面并没有真正的私有成员,只不过是在编译的时候直接将成员 替换成了 。解释器在碰到 的时候直接将其解释为 ,这样一来,在类外面就不能通过 的方式访问了。这在一定程度上体现的私有成员的意义,不过这就没法阻止外部通过 访问私有成员了。

不过要注意, exec()、eval()、getattr()、setattr()、delattr() 在类里面无法通过 的方式访问私有变量

我的理解是,在使用上面的几个方法访问成员变量时,解释器不会执行将 解释为 的步骤,所以 方法执行到 时会报对象属性不存在的错误。但是,如果通过替换后的变量来访问,就不会有问题。

简单来说, Python 中私有成员其实只是在编译时通过名字的替换来实现的。当在类里访问相应的成员时,解释器会做转换,但是使用 eval() 等方法时,解释器不会执行这个步骤。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180906G06HG800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券