Python入门学习篇(十七)——封装、继承、多态

1 封装

1.1 理解

属性和方法书写到类里面的操作即为封装
封装可以理解成私有化属性和私有化方法

1.2 示例代码

class Person():p_num = 0  # 用于统计数量def __init__(self, name, age, sex, job):# __name为私有化属性self.__name = nameself.age = ageself.sex = sexself.job = job# 调用私有化属性的方法def get_name(self):return self.__name# 修改私有化属性的方法def set_name(self, name):self.__name = namedef eat(self):print("吃饭")# 私有化方法def __sleep(self):print("睡觉")# 通过公开方法简介调用私有化方法def show_sleep(self):self.__sleep()chinese_teacher = Person("张三", 24, "男", "语文老师")
print(f"name的值为: {chinese_teacher.get_name()}")
chinese_teacher.show_sleep()

1.3 运行截图

在这里插入图片描述

2 继承

2.1 理解

子类可以继承父类的所有非私有属性和方法
为了使代码更加简洁

2.2 分类

2.2.1 常规继承

a 语法

class 类A():# 类A的属性和方法
class 类B(类A):# 类B的属性和方法
# 注意: 类B中拥有类A的所有非私有属性和非私有方法

b 示例代码

class Animal():def __init__(self, name, sex, age):print("父类的构造方法")self.name = nameself.sex = sexself.__age = agedef get_age(self):return self.__agedef set_age(self, age):self.__age = agedef behavior(self):print("动物的叫声")class Cat(Animal):def __init__(self, name, sex, age):print("子类的构造方法")# 调用父类的构造方法super().__init__(name, sex, age)# 当子类重写父类的方法时,子类实例化对象调用的是自己的方法def behavior(self):print("喵喵喵")cat = Cat("小金", "雄性", 5)
cat.behavior()

c 运行截图

在这里插入图片描述

2.2.2 继承传递

a 语法

class 类A():# 类A的属性和方法
class 类B(类A):# 类B的属性和方法
class 类c(类B):# 类c的属性和方法
# 注意: 类B中拥有类A的所有非私有属性和非私有方法
# 注意: 类C中拥有类A的所有非私有属性和非私有方法、类B的所有非私有属性和非私有方法
# 实际上可以理解为类C继承了类B中拥有的所有非私有属性和非私有方法(包含类B自己继承的)

b 示例代码

class Animal():def __init__(self, name, sex, age):print("父类的构造方法")self.name = nameself.sex = sexself.__age = agedef get_age(self):return self.__agedef set_age(self, age):self.__age = agedef behavior(self):print("动物的叫声")def __str__(self):return f"姓名为: {self.name},性别为:{self.sex},年龄为:{self.__age}"def describe(self):return self.__str__()class Cat(Animal):num = 0  # 数量def __init__(self, name, sex, age):print("子类的构造方法")# 调用父类的构造方法super().__init__(name, sex, age)self.num += 1# 当子类重写父类的方法时,子类实例化对象调用的是自己的方法def behavior(self):print("喵喵喵")# DragonLi是狸花猫的意思
class DragonLi(Cat):def __init__(self, name, sex, age):print("孙类的构造方法")# 调用父类的构造方法super().__init__(name, sex, age)def behavior(self):print("出去玩耍了")cat = DragonLi("小金", "雄性", 5)
print("修改前: ", cat.describe())
cat.set_age(6)
print("修改后: ", cat.describe())
cat.behavior()
print("当前猫的数量为:", cat.num)

c 运行截图

在这里插入图片描述

2.2.3 多继承(继承多个不同父类)

a 语法

class 类A():# 类A的属性和方法
class 类B():# 类B的属性和方法
class 类C(类A,类B):# 类C的属性和方法
# ①当类A和类B存在同名方法时,类C调用时采用就近原则,即类c定义的括号中,哪个类在前面就调用哪个类的方法 
#   例如 class 类C(类A,类B)时,调用的就是类A中的同名方法 
# ②当类A、类B、类C均存在同名方法时,类c实例化对象调用时,调用的是类C自己的方法
# ③类c中含有类A、类B的所有非私有属性和非私有方法

b 示例代码

class Animal():def __init__(self, name, sex, age):print("父类的构造方法")self.name = nameself.sex = sexself.__age = agedef get_age(self):return self.__agedef set_age(self, age):self.__age = agedef behavior(self):print("动物的叫声")def __str__(self):return f"姓名为: {self.name},性别为:{self.sex},年龄为:{self.__age}"def describe(self):return self.__str__()def eat_food(self):print("以有机物为食")
class Fly():# tool是代表飞翔的工具def __init__(self,tool):self.tool=tooldef behavior(self):print("芜湖起飞")def fly_reason(self):print("符合空气动力学原理")class Bird(Animal,Fly):num = 0  # 数量def __init__(self, name, sex, age):print("子类的构造方法")# 调用父类的构造方法super().__init__(name, sex, age)self.num += 1# # 当子类重写父类的方法时,子类实例化对象调用的是自己的方法# def behavior(self):#     print("叽叽喳喳")bird = Bird("小红", "雄性", 5)
print("修改前: ", bird.describe())
bird.set_age(6)
print("修改后: ", bird.describe())
# 调用的是Animal父类中的behavior方法
bird.behavior()
bird.eat_food()
bird.fly_reason()

c 运行截图

在这里插入图片描述

3 多态

3.1 语法

对象=父类(子类实例化对象)
# 多态的实现步骤如下所示:
#   ①定义父类,并提供公共方法
#   ②定义子类,并重写父类方法
#   ③传递子类对象给调用者,可以看到不同子类执行效果不同

3.2 示例代码

# 一户人家养了两只不同的品种的猫,一只是狸花猫,一只是橘猫,狸花猫喜欢出去打架、橘猫喜欢干饭
class Cat():def __init__(self, name, sex):self.name = nameself.sex = sexdef behavior(self):print("猫的行为")# 狸花猫
class DragonLi(Cat):def __init__(self, name, sex):super().__init__(name, sex)def behavior(self):print(f"品种为狸花猫的{self.name}喜欢出去打架")# 橘猫
class OrangeCat(Cat):def __init__(self, name, sex):super().__init__(name, sex)def behavior(self):print(f"品种为橘猫的{self.name}喜欢干饭")class Person():# 发现猫的行为特点,根据传入的不同的obj对象,调用不同的方法def search_attitude(self, obj):obj.behavior()d = DragonLi("小花", "雄性")
o = OrangeCat("小黄", "雌性")
p = Person()
p.search_attitude(d)
p.search_attitude(o)

3.3 运行截图

在这里插入图片描述

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

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

相关文章

使用anaconda创建爬虫spyder工程

1.由于每个工程使用的环境都可能不一样,因此一个好的习惯就是不同的工程都创建属于自己的环境,在anaconda中默认的环境是base,我们现在来创建一个名为spyder的环境,专门用于爬虫工程: //括号中名字,代表当…

森林火灾数据集

野外火灾是全球范围内最致命和危险的天然灾害之一。它不仅对人类的生命安全构成严重威胁,还对动植物的生存环境造成巨大的破坏。预测火灾行为不仅可以帮助消防员更好地应对火情,还可以为未来的火灾预防和应对策略提供有力支持。 随着航空图像技术的不断…

Windows可以ping通ubuntu,但ubuntu无法ping通windows

使用了NAT网卡和桥接网卡,电脑连了WiFi,桥接网卡桥接到WLAN上,Windows可以ping通Ubuntu但反过来不行! 1.可能是防火墙的问题,按照如下设置,无果 考虑是不是使用了两个网卡冲突了,取消NAT的链接 …

【笔记】书生·浦语大模型实战营——第一课

群公告 1月3日*更新 第一次课程视频链接:https://www.bilibili.com/video/BV1Rc411b7ns/,第一次课程只需要记笔记,没有作业。第一次课程(1月3日)和第二次课程(1月5日)到本周末(1月7日)截止,笔记记录在 知乎/CSDN/Github 或者任何你…

【操作系统xv6】学习记录--实验1 Lab: Xv6 and Unix utilities--未完

ref:https://pdos.csail.mit.edu/6.828/2020/xv6.html 实验:Lab: Xv6 and Unix utilities 环境搭建 实验环境搭建:https://blog.csdn.net/qq_45512097/article/details/126741793 搭建了1天,大家自求多福吧,哎。~搞环境真是折磨…

QProgressDialog用法及结合QThread用法,四种线程使用

1 QProgressDialog概述 QProgressDialog类提供耗时操作的进度条。 进度对话框用于向用户指示操作将花费多长时间,并演示应用程序没有冻结。此外,QPorgressDialog还可以给用户一个中止操作的机会。 进度对话框的一个常见问题是很难知道何时使用它们;操作…

Document对象详解

前言 在前端开发中,DOM(文档对象模型)扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互,实现动态的网页效果。DOM的核心部分之一就是Document对象,它代表了整个HTML文档。在本篇博客中,我们…

华媒舍:6个使你的媒体发稿推广更简单的方法!

做为新闻报道媒体从业人员,在宣传发稿上要行走在最前沿,保持竞争力。下面我们就向您介绍六个又简单又实用的方法,帮助你提升新闻报道媒体营销推广发稿效果。 方法一:明确目标群体我们应该明确定义我们自己的目标群体。掌握观众的特…

小H靶场笔记:DC-3

DC-3 January 3, 2024 4:11 PM Tags:Joomla owner:只惠摸鱼 信息收集 探测靶机ip: 192.168.199.133 nmap 扫描端口、 系统版本 漏洞 发现只有80端口开发, 且有cve-2017-8917漏洞存在是Joomla的SQL注入漏洞 Joomla版本为3.7.0…

相关性与P值

相关性与P值 0 FQA:1 相关性与显著性的关系2 相关性分析3 使用medcalc进行相关性分析:参考文章: 0 FQA: 主要描述相关性和p值分别代表什么意义? 以及如何使用medcalc计算相关性和p值。 Q1:p值代表什么意义…

【每日一题】466. 统计重复个数-2024.1.2

题目: 466. 统计重复个数 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如,str ["abc", 3] "abcabcabc" 。 如果可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。 例如&…

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

【力扣100】39.组合总和

添加链接描述 class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def backtrack(path,target,res,index):if target0:res.append(path[:])returnif target<0:return for i in range(index,len(candidates)):if target&g…

c盘扩容时,d盘无法删除卷问题

C盘扩容时&#xff0c;磁盘管理中D盘右键无法删除卷的原因 首先&#xff0c;D盘下文件夹为空&#xff0c;但是显示可用空间不是100%&#xff0c;经过排查&#xff0c;发现是虚拟内存设置在了D盘导致无法删除卷&#xff0c;这里只需要将虚拟内存放到其他盘&#xff0c;如E盘即可…

【MyBatis】配置 SQL 提示(IDEA 代码自动补全)和解决未能解析数据库 Unable to resolve table ‘employee‘ 问题

默认在 MyBatis 中编写 SQL 语句是不识别的。 需要做如下配置&#xff1a; 然后 SQL 语句可以出现提示&#xff0c;但是自己的数据库会报错&#xff1a; 原因是 IDEA 没有和 数据库 建立连接&#xff0c;需要连接数据库&#xff08;注意&#xff1a;需要具体到某个 Schema&…

springCloud之Stream

1、简介 Spring Cloud Stream是一个用来为微服务应用构建 消息驱动 能力的框架。通过使用 Spring Cloud Strea m &#xff0c;可以有效简化开发人员对消息中间件的使用复杂度&#xff0c;降低代码与消息中间件间的耦合度&#xff0c;屏蔽消息中间件 之 间的差异性&#xff0c;…

stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)

stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印的问题&#xff09; 文章目录 stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印…

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具&#xff0c;一直被许多网友们所喜欢&#xff0c;使用简单、方便。 UltraISO官方下载地址&#xff1a;https://cn.ultrais…

魔改版小市值策略

策略思路 最近几年&#xff0c;小市值策略一直都收益不错&#xff08;当然&#xff0c;不包含17年和18年&#xff09;。小市值因子对收益的影响是很大的。特别是行情不好的时候&#xff0c;大家都忙着炒作热点&#xff0c;那么这时候符合题材的小市值更加符合炒作标准了。 为…

安装tensorrt环境在linux上

在linux上输入命令 bash cat /etc/os-release 命令查看系统版本 nvidia-smi命令后有内容弹出而没有报错,表明系统中安装了NVIDIA显卡驱动&#xff0c;并且该命令成功地显示了有关NVIDIA GPU的信息。 输入nvcc -V并且看到输出时,这表明您的系统中已经安装了NVIDIA的CUDA工具…