继承 与 多态
继承
- 子类继承父类,子类的实例即是子类的类型也是父类的类型。判断是否为某个类型(的实例)可以用函数 isinstance(dog, Dog)
- 由以上的特性,在定义某些方法时,可以定义传入的类型为父类,则也可以传入不同的子类,且子类可以重写父类的方法从而显示多态性。
多态
- 多态的好处在于:我们需要传入多个子类,但是我们定义的接收类型只需要是一个父类,因为子类都是父类的类型。然后,我们只要按照对父类的操作即可,如果子类重写了父类的方法,那么实际执行会自动调用子类的方法。
- 即 对于一个实例,我们只需要知道它类型的父类,不需要知道其确切的子类型,就可以调用原本父类的方法,如果子类重写了这个方法,则会自动执行子类里的。
- 即 “开闭”原则
- 对扩展开放: 允许新增子类和重写父类的方法(允许新增Animal子类)
- 对修改封闭:不需要修改依赖父类类型的相关函数(不需要修改依赖Animal类型的run_twice()等函数)
静态语言 VS 动态语言
- Python这种动态语言不要求严格的继承体系,feel-like object 鸭子类型。
不要求传入的一定是 Dog 类型,只要保证传入的对象像Dog类一样,有一个 run() 方法就可以 - 对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
- 具体参见代码