从以上代码中应该了解到:
obj.attribute 查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以去到值。
但通过__dict__就取不到值,因为__dict__属性是基于类对象的命名空间字典。
命名空间:
局部命名空间,全局命名空间,内建命名空间
locals() 为局部命名空间, globals()全局命名空间
# 类的扩展
一种好的扩展方式,一种坏的扩展方式,自行体会
除了类的继承外,还有一种委托模式
这里应用到了 __getattr__方法, 同时还存在一个__getattribute__方法
当x.y 时,如果y不存在,则会调用__getattr__方法, 如果同时实现了__getattr__, __getattribute__方法,则只会走getattribuet方法
如果只定义了__getattribute__方法,x.y不管y存在不存在都会走__getattribute__方法
截图中,其实__repr__方法还是需要重新定义的,因为__getattr__方法对于内置属性是不起作用的,所以当我注释掉之后,打印mange的时候不是调用Person的__repr__,而是打印了默认的__repr__方法
这里突然插入一个新的点, 新式类与经典类的区别:
1、新式类继承自object, 经典类不继承任何类
2、新式类使用super(子类,self).__init__ 完成构造函数继承, 经典类是使用 父类.__init__完成构造函数继承
3、新式类:广度优先的查询 ; 经典类:python2.* 是深度优先的查询, python3.*是广度优先的查询,深度优先的查找方式已经是被废弃了