1. 下划线问题

  • 单下划线 _ 开头, 约定的类内部*‘私有’* 属性, 也可能在类外部调用, 但尽量不调用
  • 仅以双下划线 __ 开头, 那么会在属性前加上下划线和类名, 也就是比如类 class A 中有, __x, 那么实际外部访问时为 _A__x. 由此可知, 当是类方法 def __a(self) 那么这个方法不会被子类覆写, 因为覆写 __a() 实际上是 _A__a() 方法
  • 双下划线 __ 开头并以双下划线 __ 结束, 即 __x__ 这样, 这种变量不会隐性的在前面加上_类名. 而是保持本来的变量名, 从 __init__ 的系统内置也可以看也, 这是不变的, 所以我们可以在子类覆写这些方法

2. 属性访问问题

  • 如果已经在类 __slots__, __dict__ 中定义的变量属性, 访问的时候会直接从这些地方查找
  • 向父类的 __dict__ 查找
  • 新式类会调用 __getattribute__ 方法. 因为父类 object 没有 __getattr__, 所以当我们覆盖 __getattribute__ 时, 看需要自己手动调用 __getattr__. 默认下没有覆盖 __getattribute__ 时, 如果覆盖了 __getattr__ , 则会调用这个方法