Python 的私有属性和‘受保护的’属性

Python 不能像 java 那样使用 private 修饰符创建私有属性,但是 Python 有个简单的机制,能避免子类意外覆盖‘私有’属性。

举个例子,有个人编写了一个名为 dog 的类,这个类的内部用到了 mood 实例属性,但是没有将其开放,现在,你创建了 dog 类的子类:beagle,如果你有创建了名为 mood 的实例属性,那么在继承的方法中就会把 dog 类的 mood 属性覆盖掉,这是一个难以调试的问题。

为了避免这种情况,如果以 __mood 的形式(两个前导下划线,尾部没有或最多有一个下划线)命名实例属性,Python 会把属性名存入实例的 __dict__ 属性中,而且会在前面加上一个下划线和类名,因此,对 dog 类来说, __mood 会变成 _dog_mood,对beagle类来讲,会变成 _beagle_mood 。这个语言特性叫名称改写。

名称改写是一种安全措施,不能保证万无一失,它得目的是避免意外访问,不能防止故意做错事。

v1 = Vector2d(3,4)
v1.__dict__
{'_Vector2d__y':4.0,'_Vector2d_x':3.0}
v1._Vector2d__x
3.0

只要知道改写私有属性名的机制,任何人都能直接读取私有属性,可以轻松的为Vector2d实例的私有分量直接赋值。

你可能感兴趣的:(Python学习)