一、多态的引入
1、先看一个问题
2、使用传统的方法类解决
class Food:
name=None
def __init__(self,name):
self.name=name
class Fish(Food):
pass
class Bone(Food):
pass
class Animal:
name=None
def __init__(self,name):
self.name=name
class Cat(Animal):
pass
class Dog(Animal):
pass
class Master:
name=None
def __init__(self,name):
self.name=name
# 给猫猫喂鱼
def feed_cat(self,cat:Cat,fish:Fish):
print(f"主人:{self.name} 给动物:{cat.name} 喂的食物是:{fish.name}")
# 给小狗喂骨头
def feed_dog(self,dog:Dog,bone:Bone):
print(f"主人:{self.name} 给动物:{dog.name} 喂的食物是:{bone.name}")
# 测试
master=Master("小明")
cat=Cat("小花猫")
fish=Fish("黄花鱼")
dog=Dog("大黄狗")
bone=Bone("大棒骨")
master.feed_cat(cat,fish)
master.feed_dog(dog,bone)
问题分析:如果动物/食物的种类很多,怎么办?
传统的方法带来的问题是什么?如何解决?
1)问题是:代码的复用性不高,而且不利于代码维护和功能扩展
2)解决方案:引出->多态
二、多态介绍&特别说明
1、怎么理解多态
1)多态顾名思义即多种状态,不同的对象调用相同的方法,表现出不同的状态,称为多态
2)多态通常作用在继承关系上
说明:一个父类,具有多个子类,不同的子类对象调用相同的方法,执行的时候产生不同的状态,就是多态
2、实例演示
class Animal:
def cry(self):
pass
class Cat(Animal):
def cry(self):
print("小猫喵喵叫...")
class Dog(Animal):
def cry(self):
print("小狗汪汪叫...")
class Bird(Animal):
def cry(self):
print("小鸟渣渣叫...")
class Pig(Animal):
def cry(self):
print("小猪噜噜叫...")
# 注意:在Python面向对象编程中,子类对象可以传递给父类类型
def func(animal:Animal):
print(f"animal类型是{type(animal)}")
animal.cry()
# 创建对象
cat=Cat()
dog=Dog()
bird=Bird()
pig=Pig()
# 调用函数
func(cat)
func(dog)
func(bird)
func(pig)