双下划线的另一个重要的目地是,避免子类对父类同名属性的冲突:

  1. class A(object):
  2. def __init__(self):
  3. self.__private()
  4. self.public()
  5. def __private(self):
  6. print('A.__private()')
  7. def public(self):
  8. print('A.public()')
  9. class B(A):
  10. def __private(self):
  11. print('B.__private()')
  12. def public(self):
  13. print('B.public()')
  14. b = B()
  15. b.__private()
  16. b._A__private()

Output:

  1. A.__private()
  2. B.public()
  3. Traceback (most recent call last):
  4. File "xxx.py", line 43, in <module>
  5. b.__private()
  6. AttributeError: 'B' object has no attribute '__private'

当实例化 B 的时候,由于没有定义 _init 函数,将调用父类的 init _,但是由于双下划线的”混淆”效果,”self.private()”将变成 “self._Aprivate()”。