Python中双前导下划线__var的正确理解
近期作者发现很多Python学习者居然把双前导下划线(也就是双下划线前缀)理解成私有属性了,甚至是很多Python教程中也这么理解,这让作者感到惊讶。
首先先看一段代码:
class test:
def __init__(self,name):
self.__name = name
A = test('张飞')
print(A.__name)
可以发现,对象A通过对__name属性的访问,直接造成了AttributeError。
这样看起来似乎self.__name是被私有化了,然而事实真是这样么?
双前导下划线的作用
双前导下划线会导致Python解释器重写属性名,以避免子类中的命名冲突,这也叫做名称修饰。解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。
通俗的讲,使用双前导下划线的变量,会被编译器重新命名,并非是变量私有化。
那变量被改成什么了呢?
print(dir(A))
打印出对象A的所有属性和方法,并没有找到__name,却找到了一个_test__name的属性;
没错,_test__name就是被更名后的变量,单下划线+类名+变量名。
print(A._test__name)
这样就可获得所谓的“私有属性”了。
再来看一段代码:
_test__name = '张飞'
class test:
def getName(self):
return __name
A = test()
print(A.getName())
你猜会发生生么?