大家都知道,一个类的私有成员只能在其所在的类里能够访问,而在外部是不行的。比如 C++ 或者 Java 的 private 关键字就是用来声明类的私有成员的,如果一个属性或者方法被 private 声明,那么这个成员就只能在类里面才能直接使用,这样做的目的是为了封装。和很多面向对象的语言一样,Python 也支持类的私有成员的使用,不过有些差别。
然后在终端下测试
上面的结果与预期相符,但是
这就有些神奇了。原来 Python 里面并没有真正的私有成员,只不过是在编译的时候直接将成员 替换成了 。解释器在碰到 的时候直接将其解释为 ,这样一来,在类外面就不能通过 的方式访问了。这在一定程度上体现的私有成员的意义,不过这就没法阻止外部通过 访问私有成员了。
不过要注意, exec()、eval()、getattr()、setattr()、delattr() 在类里面无法通过 的方式访问私有变量
我的理解是,在使用上面的几个方法访问成员变量时,解释器不会执行将 解释为 的步骤,所以 方法执行到 时会报对象属性不存在的错误。但是,如果通过替换后的变量来访问,就不会有问题。
简单来说, Python 中私有成员其实只是在编译时通过名字的替换来实现的。当在类里访问相应的成员时,解释器会做转换,但是使用 eval() 等方法时,解释器不会执行这个步骤。