1、继承层次结构
- 定义:继承是指通用类(超类)和专用类(子类)之间的关系
- 继承的目的是对具有不同行为的类进行建模;值变化的话使用单个类,行为变化的话使用继承
- 超级超类object:所有没有明确声明超类的类都会从object类扩展
2、实现子类
- 子类对象自动具有在超类中声明的实例变量,只需要声明在超类对象中没有的实例对象
- 子类继承超类的所有方法,只需要定义子类的新方法,也可以修改继承来的方法的实现,为继承来的方法提供新的实现时就覆盖了那个方法
- 头部圆括号里的类名表示继承:class ChoiceQuestion(Question) :
- 可以使用子类对象调用继承来的方法
- 超类的实例变量是对那个类私有的,只有超类的方法才可以访问他的实例变量
3、调用超类构造函数
- 调用方式:子类构造函数中调用超类的构造函数时需要使用super().__init__()这种形式,为了避免混淆两个__init__函数,在子类构造函数中除了调用超类的构造函数,还可以添加额外的语句
- 顺序:超类构造函数应该在子类定义自己的实例变量之前被调用,定义子类实例变量必须使用self引用
4、覆盖方法
- 调用方式:在子类新的方法中可以使用super函数调用超类的旧方法,这样就可以避免直接调用超类的实例变量
5、多态
- 定义:方法调用总是在运行时由实际对象的类型决定,这叫做动态方法查询,这允许我们使用一致的方式处理不同类型的对象。在子类以及超类中均定义了setText方法,对象调用时,不需要显式说明,根据对象的类型不同,自动调用了对应的方法
- isinstance函数:这个函数也可以决定一个对象是否是一个子类的实例,例如isinstance(q, Question),将判断是否是Question类的任何子类的实例,若是返回True
- 抽象类:至少包含一个抽象方法的类叫做抽象类,不包含抽象方法的类叫做具体类,让方法只有一句raise NotImplementedError 抛出异常的语句,就可以强制子类说明该方法的具体实现
6、几何形状类层次结构