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

news2024/10/6 8:39:32

文章目录

  • P128 多态问题的引出
  • P129 多态细节和使用
      • 1. 多态介绍&特别说明
      • 2. 多态的好处
      • 3. 特别说明: Python多态的特点
      • 4. 使用多态的机制来解决主人喂食物的问题

P128 多态问题的引出

  • 先看一个问题
    在这里插入图片描述

# 说明: 先试用传统的方式完成
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 Dog(Animal):
    # 特有的属性和方法
    pass

class Cat(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("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):
        pass

class Dog(Animal):
    # 特有的属性和方法
    pass

class 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 = None

    def __init__(self, name):
        self.name = name


class Fish(Food):
    # 特有的属性和方法
    pass


class Bone(Food):
    # 特有的属性和方法
    pass
class Grass(Food):
    # 特有的属性和方法
    pass

class Animal:
    name = None

    def __init__(self, name):
        self.name = name

class Dog(Animal):
    pass

class Cat(Animal):
    pass
class Horse(Animal):
    pass

class Master:
    name = None

    def __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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx: [warn] 20240 worker_connections exceed open file resource limit: 1024

nginx: [warn] 20240 worker_connections exceed open file resource limit: 1024 报错翻译过来就是: nginx:[警告] 20240 worker_connections超出打开文件资源限制:1024 解决方法: 1.查看当前文件打开数量的限制 ulimit -S…

深入了解DDoS攻击及其防护措施

深入了解DDoS攻击及其防护措施 分布式拒绝服务(Distributed Denial of Service,DDoS)攻击是当今互联网环境中最具破坏性和普遍性的网络威胁之一。DDoS攻击不仅危及企业的运营,还可能损害其声誉,造成客户信任度的下降。…

在CAM350中如何删除PCB走线的一部分?

在CAM350中如何删除PCB一条走线的一部分? 在CAM350中如何删除走线? 操作方法如下: 1、因为这是一整条线,如果点击删除,整条线会被全部删除。可以在你想删除的位置增加一个节点。 选择菜单栏→edit 选择→add vertax 2…

【最新综述】医学图像分割深度半监督学习(上)

摘要: 最近,深度学习在各种计算机视觉任务中展现出了巨大的前景。然而,在许多实际应用中,没有大规模的标记数据集,这限制了深度学习的应用。为了解决这个问题,半监督学习引起了计算机视觉界的广泛关注&…

Steam社区101错误代码/steam社区报错、打不开怎么办

Steam社区是很多游戏玩家经常逛的一个互动空间,玩家可以在Steam社区了解游戏的相关评价,也可以在Steam社区和五湖四海的游戏玩家一起讨论最近游戏的心得,分享游玩技巧,探讨游戏战术等等,结识不同地区的玩家。不过很多玩…

WAIC | 斯梅尔数学与计算研究院邀您莅临WAIC 2024“数学与人工智能”论坛

当我们谈论起人工智能这一变革性力量时,就不得不提及数学。人工智能作为当今社会的热门话题,从AlphaGo到ChatGPT,从智能制造到数字文旅,它的发展和应用深刻地影响着行业和人们的生活。然而,人工智能的发展和基础离不开…

跨平台营销的智能协同:Kompas.ai如何整合多渠道策略

引言 在数字化营销的今天,消费者的注意力分散在多个平台上。品牌要想有效地吸引和保持消费者的关注,就必须采取跨平台营销策略。Kompas.ai,作为一款智能营销工具,能够帮助品牌实现这一目标。 跨平台营销的重要性 跨平台营销能够…

Redis哨兵和集群模式

特性哨兵模式集群模式高可用性是是数据分片否是水平扩展否是配置复杂度低高管理复杂度低高多键操作支持是否(有限制) 哨兵模式 原理: Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障…

Rust借助dotenv库读取环境变量

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

信息收集---端口服务信息收集

1. 什么是端口 是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45…

欧洲智慧能源展揭幕,海博思创闪耀登场展示储能创新

近日,备受瞩目的欧洲智慧能源展(The Smarter E Europe)盛大开幕,吸引了全球能源行业的目光。在这场国际性的盛会中,中国储能行业的领军企业海博思创凭借卓越的技术实力和创新的解决方案,成为展会上一颗耀眼…

Docker 运行Nacos无法访问地址解决方法

参考我的上一篇文章去配置好镜像加速器,镜像加速器不是配置越多越好,重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆,发现下不下来。 镜像源地址:https:…

中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO

关于CCRC-DCO证书的颁发机构,它是由中国网络安全审查认证与市场监管大数据中心(简称CCRC)负责。 该中心在2006年得到中央机构编制委员会办公室的批准成立,隶属于国家市场监督管理总局,是其直辖的事业单位。 依据《网络…

python如何求不定积分

sympy介绍 sympy库的安装非常的简单,利用conda命令可以快速的完成安装。 conda install sympy 接下来,我们将介绍利用第三方库sympy来完成积分的计算。 python求解不定积分 接下来,我们将介绍上述的不定积分的求解。 首先导入sympy库中的…

老司机翻车,一次失败的Oracle备份恢复,核心应用彻底瘫痪...

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

亚马逊测评风控全解析:如何有效避免砍单与封号?

许多朋友都困惑,为什么在测评时频繁遭遇砍单和封号?其实,测评可不是简单地买个IP或几个买家号就能搞定的事。 首先,咱们得审视一下自己的操作环境,是不是真的安全无虞,还是经常莫名其妙就被封了号、砍了单&…

基于java+springboot+vue实现的旅游管理系统(文末源码+Lw)227

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时间内处理完毕庞大的数据信息&a…

三层限流:为高并发系统保驾护航

文章目录 前言第一层限流:Nginx 层面的 IP 限流第二层限流:Gateway 对用户层级的限流第三层限流:微服务限流分布式限流和单机限流的优缺点:1、RateLimiter的使用2、Hystrix的使用3、Redislua脚本4、使用Sentinel 关于为何同时使用…

力扣:LCR 024. 反转链表(Java)

目录 题目描述:示例 1:示例 2:代码实现: 题目描述: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出&#x…

Python实现接糖果小游戏

介绍: 基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果,接住糖果会增加得分。 代码: import pygame import random import os# 初始化pygame和设置屏幕大小 pygame.init() screen_width, screen_height 800, 6…