Python命名空间
1.有点号和无点号的变量名,会使用不同的方式处理
- 无点号运算符的变量名,使用
LEGB
作用域规则查找名字 - 有点好运算符的变量名,使用的是对象的命名空间查找名字
- 模块的作用域以及类的作用域会对对象的命名空间进行初始化
2.模块、类、实例对象的命名空间实际上是以字典的形式实现的,并由内置属性.__dict__
表示
- 属性点号运算其实内部就是字典的索引运算
- 属性继承其实就是搜索链接的字典
每个实例都有各自独立的命名空间字典。初始时为空字典。
随着对self
或者对象的属性赋值,命名空间字典不断扩张
3.读取属性可以通过点运算符或者直接通过键索引:
obj.attr #通过点运算符
obj.__dict__['attr']#通过键索引
通过键索引时必须给出属性名字符串;通过点运算符时给出的是属性名(不是字符串)
4.dir
函数可以输出对象的所有可访问属性,包括它继承的名字(以及其他一些内置的系统属性)