为何使用类
从以下两大方面来看OOP非常有用:
- 继承:对于一些通用属性只需要将通用属性代码实现一次,就能让未来我们所创建的所有种类的机器人都可以重用;
- 组合:每一个组件都可以写成类,并定义自己的行为及关系;
类的三个独特之处:
- 多重实例:
类本质上是产生对象的工厂,每当我们调用一个类的时候,就会产生一个独立的命名空间的新对象。每个由类产生的对象都能读取类的属性,并且获得自己的命名空间来存储数据,这些数据是属于每个对象本身的。 - 通过继承进行定制:
一般来说,类可以建立命名空间的层次结构,而这种层次结构可以定义该结构中类创建的对象所使用的名称。 - 运算符重载:
通过提供特定的协议方法,类可以定义对象来响应在内置类型上的一些运算符。
概览OOP
属性继承搜索
python中OOP的方法调用的表达式:
object.attribute
这一表达式会在python中启动一次搜索,即搜索对象连接的类树,来寻找attribute首次出现的类;
找出attribute首次出现的地方,先搜索object,然后是该对象之上的所有类,由下往上,由左到右;
换句话来说,属性访问就只是搜索树而已。我们称这种搜索为继承,因为树中位置较低的对象继承了树中位置较高的对象所拥有的属性。当从下至上进行搜索时,连接至树中的对象就是树中所有父节点定义的所有属性的并集,直到树的根部。
需要注意的是,类和通过类产生的实例是两种不同的对象类型:
- 类:
类是实例工厂。类的属性提供了行为(数据以及函数),所有从类产生的实例都继承该类的属性(例如,通过时薪和小时数计算员工薪水的函数)。 - 实例
代表程序领域中具体的元素。实例的属性记录了每个实例自己的数据(例如,一个员工的社会保险账号)
我们可以按照椭圆形在树中的相对位置再进一步分类。我们通常把树中位置较高的类称为父类( superclass)(比如C2和C3)。树中位置较低的类则称为子类( subclass)(比如C1),这些术语表明了树中的相对位置和角色,父类提供了所有子类共享