文章目录
- P128 多态问题的引出
- P129 多态细节和使用
- 1. 多态介绍&特别说明
- 2. 多态的好处
- 3. 特别说明: Python多态的特点
- 4. 使用多态的机制来解决主人喂食物的问题
P128 多态问题的引出
- 先看一个问题
class Food:name = Nonedef __init__(self,name):self.name = nameclass Fish(Food):passclass Bone(Food):passclass Animal:name = Nonedef __init__(self,name):self.name = nameclass Dog(Animal):passclass Cat(Animal):passclass Master:name = Nonedef __init__(self, name):self.name = namedef 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("zoran")
cat = Cat("小花猫")
fish = Fish("黄花鱼")
dog = Dog("大黄狗")
bone = Bone("大棒骨")master.feed__cat(cat,fish)
master.feed__dog(dog,bone)
1)问题是:代码的复用性不高,而且不利于代码维护和功能扩展
2)解决方案:引出我们要讲解的多态
P129 多态细节和使用
1. 多态介绍&特别说明
class Animal:def cry(self):passclass Dog(Animal):passclass Cat(Animal):def cry(self):print("小猫喵喵叫...")class Dog(Animal):def cry(self):print("小狗汪汪叫...")class Pig(Animal):def cry(self):print("小猪噜噜叫...")
def func(animal: Animal):animal.cry()cat = Cat()
dog = Dog()
pig = Pig()func(cat)
func(dog)
func(pig)
2. 多态的好处
3. 特别说明: Python多态的特点
1)Python中函数/方法的参数是没有类型限制的,所以多态在python中的体现并不是很严谨(比如:和java等强类型语言比)
2)Python并不要求严格的继承体系,关注的不是对象的类型本身,而是它是否具有要调用的方法(行为)
class AA:def hi(self):print("AA-hi()..")class BB:def hi(self):print("BB-hi()...")def test(obj):obj.hi()aa = AA()
bb = BB()
test(aa)
test(bb)
4. 使用多态的机制来解决主人喂食物的问题
class Food:name = Nonedef __init__(self, name):self.name = nameclass Fish(Food):passclass Bone(Food):pass
class Grass(Food):passclass Animal:name = Nonedef __init__(self, name):self.name = nameclass Dog(Animal):passclass Cat(Animal):pass
class Horse(Animal):passclass Master:name = Nonedef __init__(self, name):self.name = namedef feed(self, animal: Animal, food: Food):print(f"主人{self.name},给动物:{animal.name},喂的食物是{food.name}")
master = Master("Zoran")
cat = Cat("小花猫")
fish = Fish("黄花鱼")
dog = Dog("大黄狗")
bone = Bone("大棒骨")
horse = Horse("乌骓马")
grass = Grass("新鲜草")master.feed(cat, fish)
master.feed(dog, bone)
master.feed(horse, grass)