双下划线的另一个重要的目地是,避免子类对父类同名属性的冲突:
class A(object):
def __init__(self):
self.__private()
self.public()
def __private(self):
print('A.__private()')
def public(self):
print('A.public()')
class B(A):
def __private(self):
print('B.__private()')
def public(self):
print('B.public()')
b = B()
b.__private()
b._A__private()
Output:
A.__private()
B.public()
Traceback (most recent call last):
File "xxx.py", line 43, in <module>
b.__private()
AttributeError: 'B' object has no attribute '__private'
当实例化 B 的时候,由于没有定义 _init 函数,将调用父类的 init _,但是由于双下划线的”混淆”效果,”self.private()”将变成 “self._Aprivate()”。