前言
一般来讲,我们将仅可以在类中但不能被外部调用的变量或方法称为私有代码,在C++和Java中采用private关键字作为私有代码的标记。在本篇文章中将介绍python使用名称修饰方法区分私有代码的方式。
名称修饰(name mangling)
名词修饰的用法就是在一个属性前面加上__前缀,其实相当于是一种重命名方式。
假设我们创建了这样一个类,用名称修饰的方式创建一个变量:__secret_value
class MyClass:
__secret_value = 1
如果我们直接调用
instance_of = MyClass()
print(instance_of.__secret_value)
产生报错如下
AttributeError: 'MyClass' object has no attribute '__secret_value'
但是这样的做法只是为了避免继承中的名称冲突。因为属性被重命名为以类名为前缀的名称,这并不是真正的锁定(real lock),也就是我们仍然可以通过加上类的前缀名的方式获取到变量。
获取变量方式如下
print(instance_of._MyClass__secret_value)
所以在实践中往往不使用__
而是_
来重命名,这样不会触发名称修饰的算法。
经过修改之后我们来查看一下类对象,发现确实不再存在和我们定义的对象相关的任何值了
class MyClass:
_secret_value = 1
instance_of = MyClass()
print(dir(MyClass))