您的位置:首页 > 财经 > 产业 > HSP_12章 Python面向对象编程oop_多态

HSP_12章 Python面向对象编程oop_多态

2024/11/18 3:01:36 来源:https://blog.csdn.net/pigerr/article/details/140096046  浏览:    关键词:HSP_12章 Python面向对象编程oop_多态

文章目录

  • 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("小猪噜噜叫...")#注意; 在Python 面向对象变成中,子类对象可以传递给父类对象
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 = name# 主人  给动物 喂食物def 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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com