1. 类的继承

       •继承是面向对象三大特性之一(封装,多态)
       •继承,是一种对类的进行分层级划分的概念
       •继承的基本思想是在一个类的基础上定制出一个新的类,这个不仅可以继承原来类的属性和方法,还可以增加新的属性和方法。
       •原来的类被称为父类,新的类被称为子类
       •继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性

基本语法:
class 子类名(父类名):
    代码块

       •注意:python支持多重继承,一个子类可以继承多个父类
       •在开发中没有特殊情况,应该尽量避免使用多重继承。因
为多重继承会让我们的代码更加复杂
       •如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,找第三个…前面会覆盖后面的

基本语法:
class 子类名(父类名1,父类名2,父类名3...):
    代码块
代码演示:
class Animal():
    def __init__(self, name):
        self.name = name#初始化

    def play(self):
        print('我是%s' % self.name)

class Dog(Animal):#子类继承父类
    pass

cc = Dog('初一')
cc.play()#继承父类的play方法
#输出结果:我是初一

       •如果子类定义了初始化方法,则父类的初始化方法不会被自动调用,需要在子类中自动进行初始化
       •为了提高代码书写效率,可以使用super()函数来调用父类的初始化方法
       •也可在子类中自行书写初始化方法

class Animal():
    def __init__(self, name, age):#父类的初始化
        self.name = name
        self.age = age

    def play(self):#父类的play方法
        print('我叫%s' % self.name)


class Dog(Animal):#定义子类继承父类
    def __init__(self, name, age):
        super().__init__(name, age)#super调用父类初始化

    def make(self):#子类的make方法
        print('我今年%s岁了' % self.age)

cc = Dog('初一', 5)
cc.play()#调用父类的play方法
cc.make()#调用子类的make方法
#输出结果:我叫初一
#         我今年5岁了
方法的重写

       •如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖) 就近原则
       •当我们需要调用一个对象的方法时:
              • 会优先在当前对象中寻找是否具有该方法,如果有则直接调用
              • 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
              • 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了

class Big():

    def make(self):
        print('调用父类的父类的方法')

class Little(Big):

    def speak(self):
        print('调用父类的方法')

class Small(Little):
    
    def play(self):
        print('调用自己的方法')

cx = Small()
cx.play()
cx.speak()
cx.make()
#输出结果:调用自己的方法
#          调用父类的方法
#          调用父类的父类的方法

2. 多态

       •多态是面向对象的三大特性之一。(封装,继承) 就是多种形态
       •一个对象可以以不同形态去呈现
       •多态意味着即使不知道变量所引用的对象是什么类型,也能对对象就行操作,多态会根据类的不同而表现出不同行为

class Animal:
    def say(self):
        print("Animal")

class Dog(Animal):
    def say(self):
        print("Dog")

class Cat(Animal):
    def say(self):
        print("Cat")

def animal_say(animal:Animal):
    animal.say()

dog = Dog()
cat = Cat()

animal_say(dog)
animal_say(cat)

       •函数animal_say不关心参数类型到底是什么,只关心它们是否是“Animal”或者是“Animal”的子类,不需要对于函数animal_say进行修改,即可被新的“Animal”子类所调用