Python命名空间

1.有点号和无点号的变量名,会使用不同的方式处理

  • 无点号运算符的变量名,使用LEGB作用域规则查找名字
  • 有点好运算符的变量名,使用的是对象的命名空间查找名字
  • 模块的作用域以及类的作用域会对对象的命名空间进行初始化

2.模块、类、实例对象的命名空间实际上是以字典的形式实现的,并由内置属性.__dict__表示

  • 属性点号运算其实内部就是字典的索引运算
  • 属性继承其实就是搜索链接的字典

    每个实例都有各自独立的命名空间字典。初始时为空字典。
    随着对self或者对象的属性赋值,命名空间字典不断扩张

3.读取属性可以通过点运算符或者直接通过键索引:

  1. obj.attr #通过点运算符
  2. obj.__dict__['attr']#通过键索引

通过键索引时必须给出属性名字符串;通过点运算符时给出的是属性名(不是字符串)

4.dir函数可以输出对象的所有可访问属性,包括它继承的名字(以及其他一些内置的系统属性)
dir展示所有可访问属性