面向对象三大特性
- 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中
- 继承 实现代码的重用,相同的代码不需要重复的编写
- 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度
01. 单继承
1.1 继承的概念、语法和特点
继承的概念:子类 拥有 父类 的所有 方法 和 属性
class Animal: def eat(self): print("吃") def drink(self): print("喝") def run(self): print("跑") def sleep(self): print("睡") class Dog: def eat(self): print("吃") def drink(self): print("喝") def run(self): print("跑") def sleep(self): print("睡") def bark(self): print("汪汪叫") # 创建一个对象 - 狗对象 wangcai = Dog() wangcai.eat() wangcai.drink() wangcai.run() wangcai.sleep() wangcai.bark()
1) 继承的语法
class 类名(父类名): pass
class Animal: def eat(self): print("吃---") def drink(self): print("喝---") def run(self): print("跑---") def sleep(self): print("睡---") class Dog(Animal): # 子类拥有父类的所有属性和方法 # def eat(self): # print("吃") # # def drink(self): # print("喝") # # def run(self): # print("跑") # # def sleep(self): # print("睡") def bark(self): print("汪汪叫") # 创建一个对象 - 狗对象 wangcai = Dog() wangcai.eat() wangcai.drink() wangcai.run() wangcai.sleep() wangcai.bark()
- 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
- 子类 中应该根据 职责,封装 子类特有的属性和方法
2) 专业术语
Dog
类是Animal
类的子类,Animal
类是Dog
类的父类,Dog
类从Animal
类继承Dog
类是Animal
类的派生类,Animal
类是Dog
类的基类,Dog
类从Animal
类派生
3) 继承的传递性
C
类从B
类继承,B
类又从A
类继承- 那么
C
类就具有B
类和A
类的所有属性和方法
子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法
class Animal: def eat(self): print("吃---") def drink(self): print("喝---") def run(self): print("跑---") def sleep(self): print("睡---") class Dog(Animal): def bark(self): print("汪汪叫") class XiaoTianQuan(Dog): def fly(self): print("我会飞") class Cat(Animal): def catch(self): print("抓老鼠") # 创建一个哮天犬的对象 xtq = XiaoTianQuan() xtq.fly() xtq.bark() xtq.eat() xtq.catch()
提问:哮天犬 能够调用 Cat
类中定义的 catch
方法吗?
答案:不能,因为 哮天犬 和 Cat
之间没有 继承 关系。
1.2 方法的重写
- 子类 拥有 父类 的所有 方法 和 属性
- 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
应用场景
- 当 父类 的方法实现不能满足子类需求时,可以对方法进行 重写(override)
重写 父类方法有两种情况:
- 覆盖 父类的方法
- 对父类方法进行 扩展
1) 覆盖父类的方法
- 如果在开发中,父类的方法实现 和 子类的方法实现,完全不同
- 就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现
具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现
重写之后,在运行时,只会调用 子类中重写的方法,而不再会调用 父类封装的方法
class Animal: def eat(self): print("吃---") def drink(self): print("喝---") def run(self): print("跑---") def sleep(self): print("睡---") class Dog(Animal): def bark(self): print("汪汪叫") class XiaoTianQuan(Dog): def fly(self): print("我会飞") def bark(self): print("叫得跟神一样...") xtq = XiaoTianQuan() # 如果子类中,重写了父类的方法 # 在使用子类对象调用方法时,会调用子类中重写的方法 xtq.bark()