038.Python面向对象_三大特性综合案例1

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

三大特性综合案例1

    • 三大特性综合案例1
      • 案例要求
      • 怎样通过代码解决问题
      • 代码实现

三大特性综合案例1

案例要求

# 定义三个类:小狗、小猫、人
# 小狗:
    # 姓名、年龄(默认1岁)
    # 吃饭、玩、睡觉、看家 (格式:名字是xx,年龄xx岁的小狗在xx)
# 小猫:
    # 姓名、年龄(默认1岁)
    # 吃饭、玩、睡觉、捉老鼠 (格式:名字是xx,年龄xx岁的小猫在xx)
# 人:
    # 姓名、年龄(默认1岁)、宠物
    # 吃饭、玩、睡觉 (格式:名字是xx,年龄xx岁的小猫在xx)
    # 养宠物(让所有的宠物吃饭、玩、睡觉)
    # 让宠物工作(让所有的宠物根据自己的职责开始工作)

怎样通过代码解决问题

  • 1、有开发经验的
    • 根据自己的开发经验,制定出一套自以为完美的解决方案,通过代码实现这个方案
  • 2、无开发经验的
    • 有进取心的:提出问题 —— 直接通过代码实现能够想到的问题,检测发现代码问题,重构代码,不断的去升级方案
    • 无进取心的:提出问题 —— 直接通过代码实现能够想到的问题

代码实现

  • 第一版:首先实现Dog类
    class Dog:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小狗正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def watch(self):
            print(f'{self}看家...')
    
    
    d = Dog('小黑')
    d.eat()
    
  • 第二版:实现Cat类和Person类(基本与Dog类一致,可以直接复制修改即可)
    class Person:
        def __init__(self, name, pets, age=1):
            self.name = name
            self.age = age
            self.pets = pets
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁,正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def yangPets(self):
            for pet in self.pets:
                pet.eat()
                pet.play()
                pet.sleep()
    
        def pets_work(self):
            for pet in self.pets:
                if isinstance(pet, Dog):
                    pet.watch()
                elif isinstance(pet, Cat):
                    pet.catch()
    
    class Cat:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小猫正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def catch(self):
            print(f'{self}捉老鼠...')
    
    
    class Dog:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小狗正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def watch(self):
            print(f'{self}看家...')
    
    
    d = Dog('小黑')
    d.eat()
    
  • 第三版:在这里就发现了问题,两种动物的工作方法用了两种不同的方法名称,所以在人类中调用的时候需要判断类型,再根据类型调用不同的方法,后续再增加新的动物,那就需要再增加更多的判断。
  • 解决方法:我们可以把所有动物工作的方法名进行统一,后续在调用工作的方法的时候就不需要再进行判断了
    class Person:
        def __init__(self, name, pets, age=1):
            self.name = name
            self.age = age
            self.pets = pets
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁,正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def yangPets(self):
            for pet in self.pets:
                pet.eat()
                pet.play()
                pet.sleep()
    
        def pets_work(self):
            for pet in self.pets:
                pet.work()
    
    class Cat:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小猫正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def work(self):
            print(f'{self}捉老鼠...')
    
    
    class Dog:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小狗正在'
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
        def work(self):
            print(f'{self}看家...')
    
    
    d = Dog('小黑')
    d.eat()
    
  • 第四版:在上面的代码中可以发现有很多相同的部分,造成了大量的冗余代码,比如吃饭、睡觉、玩耍这些方法,在三个类中都写了一遍…
  • 解决方案:我们可以将这些共有的特性提取出来封装到一个父类中,然后这些具体的类都继承这个父类就可以了
    class Animall:
        def __init__(self, name, age=1):
            self.name = name
            self.age = age
    
        def eat(self):
            print(f'{self}吃饭...')
    
        def play(self):
            print(f'{self}玩耍...')
    
        def sleep(self):
            print(f'{self}睡觉...')
    
    
    class Person(Animall):
        def __init__(self, name, pets, age=1):
            super(Person, self).__init__(name, age)
            self.pets = pets
    
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁,正在'
    
        def yangPets(self):
            for pet in self.pets:
                pet.eat()
                pet.play()
                pet.sleep()
                print('')
    
        def pets_work(self):
            for pet in self.pets:
                pet.work()
    
    
    class Cat(Animall):
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小猫正在'
    
        def work(self):
            print(f'{self}捉老鼠...')
    
    
    class Dog(Animall):
        def __str__(self):
            return f'名字是{self.name}, 年龄{self.age}岁的小狗正在'
    
        def work(self):
            print(f'{self}看家...')
    
    
    d1 = Dog('小黑')
    d2 = Dog('小黄')
    c1 = Cat('小花')
    c2 = Cat('小白')
    
    p = Person('失心疯',[d1, d2, c1, c2], 36)
    # p.pets_work()
    p.yangPets()
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源贡献世纪榜评选揭晓,TDengine 成功入选并亮相 FICC 开源计算机系统大会

12 月 3-6 日,2023 国际测试委员会智能计算机与芯片联邦大会(FICC)在海南三亚举行,本次大会主要分为四个会议:芯片大会,智能计算机、算法与应用大会,开源计算机系统大会,测试基准与标…

注册与回调

C 再论无处不在的回调机制---注册与回调 回调函数的作用和用途,我就不多说了,之前也讨论过, 现在再来熟悉一下与回调函数相关的程序。 我们知道, 回调机制, 就是通过函数指针来实现的。 说白了, 就是注册与…

算法-05-二分查找

二分查找(Binary Search)算法,也叫折半查找算法,是一种针对有序数据集合的查找算法。 1-二分查找的思想 我们生活中猜数字的游戏,告诉你一个数据范围,比如0-100,然后你说出一个数字&#xff0c…

【lesson8】表的约束(1)

文章目录 表的约束的介绍空属性约束(null)和非空属性约束测试建表插入测试 默认值约束测试建表测试 建表查看默认行为建表插入测试 表的约束的介绍 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束&#…

LeetCode-交换链表中节点的问题

两两交换链表中的节点 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 思路: 首先将整个链…

MinGW编译Ptyhon至pyd踩坑整理

注意需要魔法 用scoop自动安装配置MinGw 需要魔法,不需要手动配置mingw scoop install mingw安装Cython,Setuptools第三方库 关闭魔法,使用清华源 pip install setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install cyt…

800万纯AI战士年末大集结,硬核干货与音乐美食12月28日准时开炫

回望2023年,大语言模型或许将是科技史上最浓墨重彩的一笔。从技术、产业到生态,大语言模型在突飞猛进中加速重构万物。随着理解、生成、逻辑、记忆四大能力显著提升,大语言模型为通用人工智能带来曙光。 AI开发者们正在用算法和代码书写一个美…

Python简单网抑云数据采集 JS逆向

嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 Pycharm 模块使用: requests -> pip install requests execjs -> pip install execjs 爬虫实现基本思路流程: 一. 数据来源分析: 明确需求: 明确采集的网站以及数据内容 网址: https://mu…

【java】java类/方法冲突解决工具

目录下查找包含特定名称(如:类名称)的Jar包 上代码: 比如要查找含有类 “org/apache/avro/Schema” 的: # 方法一 # 此方法只能查找到内容(比如:类名称)。但是不能打印jar名称 fi…

大数据Vue项目必备|Window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

大数据Vue项目必备|Window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm) 一、卸载旧版本 如果已经安装了node,那么需要先卸载node,如果没有安装那可以直接跳过这一步。 卸载:   打开控制面板 -> 打开程序和…

2个实用的快速涨粉视频号数据分析平台

很多人在做视频号的视频总不知道怎么利用视频号进行数据分析以及如何涨粉?今天就说两个视频号数据分析平台 可以查询各项爆款数据,什么账号大火、什么领域热大家都在关心什么快速了解。 1:视频号助手(https://channels.weixin.q…

一文了解什么是Selenium自动化测试?

一、Selenium是什么? 用官网的一句话来讲:Selenium automates browsers. Thats it!简单来讲,Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏…

手把手搭建腾讯云服务器教程(新手必看)

使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程,…

社区团购行业分析:未来在门店拓展上还有很大的发展空间

社区团购是真实居住社区内居民团体的一种互联网线上线下购物消费行为,是依托真实社区的一种区域化、小众化、本地化、网络化的团购形式。简而言之,它是依托社区和团长社交关系实现生鲜商品流通的新零售模式。 社区团购,是指一定数量的消费者通…

Android 蓝牙BluetoothAdapter 相关(一)

Android 蓝牙相关 本文主要讲述android 蓝牙的简单使用. 1: 是否支持蓝牙 /*** 是否支持蓝牙** return*/ private boolean isSupportBluetooth() {BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter();return bluetoothAdapter ! null; }2: 开启蓝牙 …

消息队列kafka详解:Kafka架构介绍

一. 工作流程 Kafka中消息是以topic进行分类的,Producer生产消息,Consumer消费消息,都是面向topic的。 Topic是逻辑上的改变,Partition是物理上的概念,每个Partition对应着一个log文件,该log文件中存储的就…

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…

C++学习笔记(十一)------has_a和use_a关系

文章目录 前言 一、has_a关系 1.1 has_a概念 1.2 has_a中构造和析构的顺序 1.3 has_a对象的内存情况 二、use_a关系(友元关系) 1.友元函数: 2.友元类 3 使用多文件编程的方式重新编辑上述代码 总结 前言 随着技术的革新,出现各种各…

信奥赛 1310:【例2.2】车厢重组

本题解析:根据上述的要求,转化为程序的解题方案,就是用到了冒泡排序。本题中求的是旋转次数,实际上就是冒泡排序中交换的次数。 本题考察的知识点是:冒泡排序的用法。 参考代码: 上述代码仅供参考&#xff…

Vue学习计划-Vue2--VueCLi(四)组件传值和自定义事件

1. 组件传值 组件化编码流程: 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用: 一个组件在用&#xff0c…