类的重用技术通过创建新类来复用已有的代码,而不必从头开始编写,可以使用系统标准类库、开源项目中的类库、自定义类等已经调试好的类,从而降低工作量并减少错误的可能性。
类的设计中主要有两种重用方法:类的继承与类的组合。
1)类的继承是指在现有类的基础上创建新类,在新类中添加代码,以扩展原有类的属性(数据成员)和方法(成员函数)。
2)类的组合是指在新创建的类中包含有已有类的对象作为其属性。
1、继承
类的继承关系体现在类定义的语法中:
class ChildClassName(ParentClassName1[, ParentClassName2[,ParentClassName3, …]]): #类体或pass语句
子类ChildClassName从圆括号中的父类派生,继承父类的非私有属性和非私有方法。如果圆括号中没有内容,则表示从object类派生。如果只是给出一个定义,尚没有定义类体时,使用pass语句代替类体。
子类继承父类中的非私有属性,但不能继承父类的私有属性,也无法在子类中访问父类的私有属性。
子类只能通过父类中的公有方法访问父类中的私有属性。
当子类中定义了与父类中同名的方法时,子类中的方法将覆盖父类中的同名方法,也就是重写了父类中的同名方法。
在Python的继承关系中,如果子类的初始化方法没有覆盖父类的初始化方法__init__(),则在创建子类对象时,默认执行父类的初始化方法。
2、组合
类的组合(composition)是类的另一种重用方式。如果程序中的类需要使用其他类的对象,就可以使用类的组合方式。组合关系可以用“has-a”关系来表达,就是一个主类中包含其他对象。
在继承关系中,父类的内部细节对于子类来说在一定程度上是可见的。所以通过继承的代码复用可以说是一种“白盒式代码复用”。在组合关系中,对象之间各自的内部细节是不可见的,所以通过组合的代码复用可以说是一种“黑盒式代码复用”。
在组合关系下有两种方法可以实现对象属性初始化。
第一种方法是通过组合类初始化方法传递被组合对象所属类的初始化方法中的参数;
第二种方法是在主程序中创建被组合类的对象,然后将这些对象传递给组合类。