python学习笔记四 (运算符重载和命名空间、类)-LMLPHP

从以上代码中应该了解到:

obj.attribute  查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以去到值。

但通过__dict__就取不到值,因为__dict__属性是基于类对象的命名空间字典。

命名空间:

局部命名空间,全局命名空间,内建命名空间

locals() 为局部命名空间, globals()全局命名空间

# 类的扩展

python学习笔记四 (运算符重载和命名空间、类)-LMLPHP

一种好的扩展方式,一种坏的扩展方式,自行体会

除了类的继承外,还有一种委托模式

python学习笔记四 (运算符重载和命名空间、类)-LMLPHP

这里应用到了 __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.*是广度优先的查询,深度优先的查找方式已经是被废弃了

05-18 15:32