-
首先明确一点,在python中,并没有绝对的私有化。
-
在Python中,没有绝对在外部访问不了的变量,但Python代码应遵循一个规范:以单个下划线开头的变量或方法应被视为非公开的API,因此不用特别声明,外部的调用者也不应该去访问以单下划线开头的变量或方法,因为类的设计者也遵循着这个规范,他会默认外部的调用者不会访问这种变量(但是如果硬要调用也是可以的)。
-
另外,Python通过一个非常简单的机制完成了一个伪私有化功能,这个机制名叫名称转写(name mangling):以双下划线开头,并以最多一个下划线结尾的标识符,例如__X,会被转写为_classname__X,其中classname为类名。这个机制实现起来非常简单,而且很大程度避免了调用者的误访问,但并不能像Java的private限定符那样完全杜绝外部的访问。
class A:
def __init__(self,a):
self.__a_ = a;
a = A(1)
print(a.__a_)
提示错误:‘A’ object has no attribute ‘_a’
这样我们就可以理解__a_是被私有化了,但是如果我们换一种调用方式
print(a._A__a_)
这样就被调用成功了
- 所以python通过名称转写,也就是将__a_,在实例对象中转写成了_A__a_,让调用者直接通过名称无法调用到这个属性,实现了伪私有化,但是调用者要强制调用还是可以的。