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.hqwc.cn/news/318221.html

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

相关文章

【Mybatis】深入学习MyBatis:高级特性与Spring整合

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

burpsuite模块介绍之extender(扩展)

extender Burp提供了对第三方拓展插件的支持,使用户能够编写自定义插件或从插件商店中安装拓展插件。这些Burp扩展程序可以以多种方式定制Burp的行为,包括修改HTTP请求和响应、自定义UI、添加自定义扫描程序检查以及访问关键的运行时信息,如代理历史记录、目标站点地图和扫…

线程的深入学习(二)

前言 上一篇讲了线程池的相关知识,这篇文章主要讲解一个 1.并发工具类如CountDownLatch、CyclicBarrier等。 2.线程安全和并发集合: 3.学习如何使用Java提供的线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。 并发工具类 …

QT、C++实验室管理系统

一、需求介绍: 题目:基于Qt的实验室管理系统的设计 项目命名以LabSystem姓名拼音首字母(例如: LabSystemwXC) 功能要求: 一,基本必要功能: 1,使用QSQLITE数据库完成数据库的设计。 2,注册功能:包含学生注册&#xff0…

计算机网络实验(四):交换机VLAN配置练习

一、实验项目名称:交换机VLAN配置练习 二、实验原理: 1. 交换机基本配置 (1)管理方式: 带内管理:通过网络接口进行管理。 带外管理:通过Console口进行近距离配置。 (2&#xf…

Java 第19章 IO流 课堂练习+本章作业

文章目录 Buffered流拷贝二进制文件创建文件写入文本读取文本文件存读Properties文件 Buffered流拷贝二进制文件 package com.hspedu.chapter19.outputStream;import java.io.*;public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath &q…

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源开放体系 大模型成为热门关键词书生浦语大模型开源历程书生浦语20B开源大模型性能从模型到应用书生浦语全链路开源开放体系数据预训练微调评测部署智能体 大模型成为热门关键词 大模型成为发展通用人工智能的重要途径 书生浦语大模型开源历程 书生浦语…

案例088:基于微信小程序的校车购票平台设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

YOLOv8改进 | 主干篇 | EfficientNetV1均衡缩放网络改进特征提取层

一、本文介绍 这次给大家带来的改进机制是EfficientNetV1主干,用其替换我们YOLOv8的特征提取网络,其主要思想是通过均衡地缩放网络的深度、宽度和分辨率,以提高卷积神经网络的性能。这种方法采用了一个简单但有效的复合系数,统一调整所有维度。经过我的实验该主干网络确实…

如何使用内网穿透工具实现远程SSH访问Deepin系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统,专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins正在通过全新的AMM方案为BRC20及多链铭文资产拓展DeFi场景,官网的全新上线意味着铭文资产的交易正式进入AMM时代。” 在2023年1月开始,Ordinals协议的推出成为了铭文赛道发展的开端,并为比特币这类非图灵完备的生态,带来了…

IO模型及高性能网络架构分析

IO调用 操作系统一次IO过程: 应用程序发起的一次IO操作包含两个阶段: IO调用:应用程序进程向操作系统内核发起调用。 IO执行:操作系统内核完成IO操作。 操作系统内核完成IO操作还包括两个过程: 准备数据阶段&#…