面向对象(进阶)(‘封装‘,‘多态‘,‘对象属性‘,‘类属性‘,‘类方法‘,‘对象方法‘及其应用场景)

news2025/5/13 1:19:07

‘封装’,'多态’及其应用场景

一, 封装及其应用场景

封装的定义

属于面向对象的三大特征之一, 就是隐藏对象的属性和现实细节, 仅对外提供公共的访问方式.(我们学的 函数, 类, 都是封装的体现).

封装的格式

__属性名
__属性名()

封装的好处和弊端

好处
  • 提高代码的安全性. 由 私有化 来保证
  • 提高代码的的复用性. 由 函数 来保证
弊端
  • 代码量增加了. 因为私有的内容外界想访问, 必须提供公共的访问方式, 代码量就增加了.

封装的案例

案例需求
  1. 定义师傅类Master.
  2. 师傅类属性.
  3. 师傅类行为.
  4. 定义学校类School.
  5. 学校类属性.
  6. 学校类行为.
  7. 定义徒弟类(包含私房钱).
  8. 徒弟类属性.
  9. 徒弟类行为.
  10. 针对私有的属性, 提供公共的访问方式 (包含’获取’和’设置’).
  11. 定义徒孙类.
  12. 创建徒孙类对象.
  13. 调用功能.
# 1. 定义师傅类.
class Master:
	# 2. 师傅类属性.
	def __init__(self):
		self.kongfu = '[古法煎饼果子配方]'

	# 3. 师傅类行为.
	def make_cake(self):
		print(f'运用{self.kongfu} 制作煎饼果子')

# 4. 定义学校类.
class Student:
	# 5. 学校类属性.
	def __init__(self):
		self.kongfu = '[黑马AI煎饼果子配方]'

	# 6. 学校类行为.
	def make_cake(self):
		print(f'运用{self.kongfu} 制作煎饼果子')

# 7. 定义徒弟类(包含私房钱).
class Prentice:
	# 8. 徒弟类属性.
	def __init__(self):
		self.kongfu = '[独创煎饼果子配方]'
		# 私房钱.
		self.__money = 20000
	# 9. 徒弟类行为.
	def make_cake(self):
		print(f'运用{self.kongfu}制作煎饼果子')
	# 10. 针对私有的属性, 提供公共的访问方式.
	def get_money(self):			# 获取	
		return self.__money
	def set_money(self, money):		# 设置
		self.__money = money		

# 11. 定义徒孙类.
class TuSun(Prentice):
	pass

# 12. 创建徒孙类对象.
ts = TuSun()
# 13. 调用功能.
perint(ts.kongfu)
ts.make_cake()
# print(ts.__money)		# 报错, 父类私有成员, 子类无法访问.
ts.set_money(100)
print(ts.get_money())	# 通过父类提供的公共的访问方式, 访问父类的私有成员.

二, 多态及其应用案例

多态的定义

同一个函数, 接收不同的参数, 有不同的效果.
同一个事物在不同时刻表现出来的不同状态, 形态

多态的前提条件

    1. 要有继承.
    1. 要有方法重写, 不然多态无意义.
    1. 要有父类引用指向子类对象.

案例:

案例(1):动物案例
案例需求

动物类案例

实现思路
  1. 定义动物类(抽象类(也叫:接口)在其内定义抽象方法).
  2. 定义子类, 狗类.
  3. 定义子类, 猫类.
  4. 汽车类.
  5. 定义函数, 接收不同的动物对象, 调用speak方法.
  6. 创建狗类, 猫类对象.
  7. 演示多态.
  8. 测试汽车类
# 1. 定义动物类(抽象类(也叫:接口)在其内定义抽象方法).
class Animal:			# 抽象类(也叫: 接口)
	def speak(self):	# 抽象方法
		pass

# 2. 定义子类, 狗类.
class Dog(Animal):
	def speak(self):
		print('狗叫: 汪汪汪')

# 3. 定义子类, 猫类.
class Cat(Animal):
	def speak(self):
		print('猫叫: 喵喵喵')

# 4. 定义汽车类.
class Car:
	def speak(self):
		print('车叫: 滴滴滴')

# 5. 定义函数, 接收不同的动物对象, 调用speak方法
def make_noise(an:Animal):		# an:Animal = Dog()
	an.speak()

# an:Animal = Dog()			# 父类引用指向子类对象(标准用法).
# d:Dog = Dog()				# 创建狗类对象.	
# 6. 创建狗类, 猫类对象.
d = Dog()
c = Cat()
# 7. 演示多态. 		
make_noise(d)
make_noise(c)

# 8. 测试汽车类
c = Car()
make_noise(c)	
案例(2): 构建战斗平台
案例需求
  1. 构建对战平台(公共的函数) object_play(), 接收: 英雄机 和 敌机.
  2. 在不修改对战平台代码的情况下, 完成多次战斗.
  3. 规则:
    • 英雄机, 1代战斗力60, 2代战斗力80
    • 敌机, 1代战斗力70
  4. 代码提示:
    • 英雄机1代 HeroFighter
    • 英雄机2代 AdvHeroFighter
    • 敌机 EnemyFighter
实现思路
  1. 定义英雄机1代, 战斗力 60
  2. 定义英雄机2代, 战斗力 80
  3. 敌机1代
  4. 构建对战平台, 公共的函数, 接收不同的参数, 有不同的效果 -> 多态.
  5. 思路1: 不使用多态, 完成对战
  6. 场景1: 英雄机1代 VS 敌机1代
  7. 场景2: 英雄机2代 VS 敌机1代
  8. 思路2: 使用多态, 完成对战
  9. 场景1: 英雄机1代 VS 敌机1代
  10. 场景2: 英雄机2代 VS 敌机1代
# 1. 定义英雄机1代, 战斗力 60
class HeroFighter:
	def power(self):
		return 60

# 2. 定义英雄机2代, 战斗力 80
class AdvHeroFighter(HeroFighter):
	def power(self):
		return 80

# 3. 敌机1代
class EnemyFighter:
	def power(self):
		return 70

# 4. 构建对战平台, 公共的函数, 接收不同的参数, 有不同的效果 -> 多态.
def object_play(hero, enemy):
	# 参1: 英雄机, 参2: 敌机
	if hero.power() >= enemy.power():
		print('英雄机 战胜 敌机!')
	else:
		print('英雄机 惜败 敌机!')

# 思路1: 不使用多态, 完成对战.
# 场景1: 英雄机1代 VS 敌机1代
h1 = HeroFighter()
e1 = EnemyFighter()
if h1.power() >= e1.power():
	print('英雄机1代 战胜 敌机1代')
else:
	print('英雄机1代 惜败 敌机1代')
# 场景2: 英雄机2代 VS 敌机1代
h2 = AdvHeroFighter()
e1 = EnemyFighter()
if h2.power() >= e1.power():
	print('英雄机2代 战胜 敌机1代')
else:
	print('英雄机2代 惜败 敌机1代')

# 思路2: 使用多态, 完成对战.
h1 = HeroFighter()
h2 = AdvHeroFighter()
e1 = EnemyFighter()
# 场景1: 英雄机1代 vs 敌机1代
object_play(h1, e1)
# 场景2: 英雄机2代 VS 敌机1代
object_play(h2,e1)
案例(3): 空调案例
抽象类的定义
  • 概述:
    • 在Python中, 抽象类 = 接口, 即 : 有抽象方法的类就是 抽象类, 也叫 接口.
  • 抽象方法 = 没有方法体的方法, 即: 方法体是 pass 修饰的.
  • 作用/目的:
    • 抽象类一般充当父类, 用于指定行业规范, 准则, 具体的实现交由 子类 来完成.
案例需求
实现思路
  1. 定义抽象类, 空调类, 设定: 空调的规则.
  2. 制冷.
  3. 制热.
  4. 左右摆风.
  5. 定义子类(小米空调), 实现父类(空调类)中的所有抽象方法.
  6. 制冷.
  7. 制热.
  8. 左右摆风.
  9. 定义子类(格力空调), 实现父类(空调类)中的所有抽象方法.
  10. 制冷.
  11. 制热.
  12. 左右摆风.
  13. 小米空调.
  14. 格力空调.
# 1. 定义抽象类, 空调类, 设定: 空调的规则.
class AC:
	# 2. 制冷.
	def cool_wind(self):
		pass
	# 3. 制热.
	def hot_wind(self):
		pass
	# 4. 左右摆风
	def swing_l_r(self):
		pass
# 5. 定义子类(小米空调), 实现父类(空调类)中的所有抽象方法.
class XiaoMi(AC):
	# 6. 制冷.
	def cool_wind(self):
		print('小米 核心 制冷技术!')
	# 7. 制热.
	def hot_wind(self):
		print('小米 核心 制热技术!')
	# 8. 左右摆风.
	def swing_l_r(self):
		print('小米空调 静音左右摆风 计数!')

# 9. 定义子类(格力空调), 实现父类(空调类)中的所有抽象方法.
class Gree(AC):
	# 10. 制冷.
	def cool_wind(self):
		print('格力 核心 制冷技术!')
	# 11. 制热.
	def hot_wind(self):
		print('格力 核心 制热技术!')
	# 12. 左右摆风.
	def swing_l_r(self):
		print('格力空调 低频左右摆风 技术!')

# 16. 小米空调.
xm = XiaoMi()
xm.cool_wind()
xm.hot_wind()
xm.swing_l_r()

# 17. 格力空调.
gree = Gree()
gree.cool_wind()
gree.hot_wind()
gree.swing_l_r()

‘对象属性’, ‘;类属性’, ‘类方法’, '静态方法’及其应用场景

三, '对象属性’和’类属性’及其应用场景

图解

在这里插入图片描述

属性的定义

概述:

属性是1个名词, 用来描述事物的外在特征的.

分类:
  • 对象属性: 属于每个对象, 即: 每个对象的属性值可能都不同. 修改A对象的属性, 不影响对象B.
  • 类属性: 属于类的, 即: 能被该类下所有的对象所共享. A对象修改类属性, B对象访问的是修改后的.
对象属性
  1. 定义到 init 魔法方法中的属性, 每个对象都有自己的内容.
  2. 只能通过 对象名. 的方式调用.
类属性
  1. 定义到类中, 函数外的属性(变量), 能被该类下所有的对象所共享.
  2. 既能通过 类名. 还能通过 对象名. 的方式来调用, 推荐使用 类名. 的方式.

案例

案例需求

定义对象属性和类属性

实现思路
  1. 定义1个 Student类, 每个学生都有自己的 姓名, 年龄.
  2. 定义类属性.
  3. 定义对象属性, 即: 写到 init 魔法放法中的属性.
  4. 定义str魔法方法, 输出对象的信息.
  5. 场景1: 对象属性.
  6. 修改s1的属性值.
  7. 场景2: 类属性.
  8. 类属性可以通过 类名. 还可以通过 对象名. 的方式调用.
  9. 尝试用 对象名. 的方式来修改 类属性.
    10.如果要修改类变量的值, 只能通过 类名. 的方式来实现.
# 1. 定义1个 Student类, 每个学生都有自己的 姓名, 年龄.
class Student:
	# 2. 定义类属性.
	teacher_name = '水镜先生'
	# 3. 定义对象属性, 即: 写到 init 魔法方法中的属性.
	def __init__(self, name, age):
		self.name = name
		self.age = age
	# 4. 定义str魔法方法, 输出对象的信息.
	def __str__(self):
		return '姓名: %s, 年龄: %d' % (self.name, self.age)
# 5. 场景1: 对象属性
s1 = Student('曹操', 38)
s2 = Student('曹操', 38)

# 6. 修改s1的属性值.
s1.name = '许褚'
s1.age = 40

print(f's1: {s1}')
print(f's2: {s2}')

# 7. 场景2: 类属性.
# 8. 类属性可以通过 类名.	还可以通过 对象名. 的方式调用.
print(s1.teacher_name)			# 水镜先生
print(s2.teacher_name)			# 水镜先生
print(Student.teacher_name)			# 水镜先生

# 9. 尝试用 对象名. 的方式来修改 类属性.
# s1.teacher_name = '夯哥'		# 只能给s1对象赋值, 不能给属性赋值.

# 10. 如果要修改类变量的值, 只能通过	类名. 的方式实现.
Student.teacher_name = '夯哥'
print(s1.teacher_name)				# 夯哥
print(s2.teacher_name)				# 夯哥
print(Student.teacher_name)				# 夯哥
							

四, '类方法’和’静态方法’及其应用场景

类方法定义:

  • 属于类的方法, 可以通过 类名. 还可以通过 对象名. 的方式来调用.
  • 定义类方法的时候, 必须使用装饰器 @classmethod , 且第1个参数必须表示 类对象.

静态方法定义:

  • 属于该类下所有对象所共享的方法, 可以通过 类名. 还可以通过 对象名. 的方式来调用.
  • 定义静态方法的时候吗必须使用装饰器 @staticmetgod , 且参数传不传都可以.

区别:

  1. 类方法的第1个参数必须是 类对象, 而静态方法无参数的特殊要求.
  2. 你可以理解为: 如果函数中要用 类对象, 就定义成 类方法, 否则定义成 静态方法, 除此外, 并无任何区别.

案例:

案例需求

定义类方法和静态方法, 并调用

实现思路
  1. 定义学生类.
  2. 定义类属性.
  3. 定义类方法.
  4. 定义静态方法.
  5. 创建学生类对象.
  6. 调用功能.
# 1. 定义学生类.
class Student:
	# 2. 定义属性类.
	school = '黑马程序员'
	# 3. 定义类方法.
	@classmethod
	def show1(cls):
		print(f'cls: {cls}')			# <class '__main__.Student'>
		print(cls.school)
		print('我是类方法')

	# 4. 定义静态方法.
	@staticmethed
	def show2():
		print(Student.scxhool)
		print('我是静态方法')

# 5. 创建学生类对象.
s1 = Student()
s1.show1()
s1.show2()

五, 总结

  • Q1: 封装的定义?

    • 属于面向对象的三大特征之一, 就是隐藏对象的属性和现实细节, 仅对外提供公共的访问方式.(我们学的 函数, 类, 都是封装的体现).
  • Q2: 多态的定义?

    • 同一个函数, 接收不同的参数, 有不同的效果.
    • 同一个事物在不同时刻表现出来的不同状态, 形态
  • Q3: 对象属性的定义?

    • 定义到 init 魔法方法中的属性, 每个对象都有自己的内容.
    • 只能通过 对象名. 的方式调用.
  • Q4: 类属性的定义?

    • 定义到类中, 函数外的属性(变量), 能被该类下所有的对象所共享.
    • 既能通过 类名. 还能通过 对象名. 的方式来调用, 推荐使用 类名. 的方式.
  • Q5: 类方法的定义?

    • 属于类的方法, 可以通过 类名. 还可以通过 对象名. 的方式来调用.
    • 定义类方法的时候, 必须使用装饰器 @classmethod , 且第1个参数必须表示 类对象.
  • Q6: 静态方法的定义?

    • 属于该类下所有对象所共享的方法, 可以通过 类名. 还可以通过 对象名. 的方式来调用.
    • 定义静态方法的时候吗必须使用装饰器 @staticmetgod , 且参数传不传都可以.

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

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

相关文章

算法模型从入门到起飞系列——广度优先遍历(BFS)

文章目录 前言一、广度优先遍历&#xff08;BFS&#xff09;简介1.1 广度优先遍历&#xff08;BFS&#xff09;的特点1.2 广度优先遍历&#xff08;BFS&#xff09;的要素 二、广度优先遍历&#xff08;BFS&#xff09;& 深度优先遍历&#xff08;DFS&#xff09;2.1 广度优…

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…

使用Python在Word中创建、读取和删除列表 - 详解

目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序&#xff08;编号&#xff09;列表 使用默认样式创建无序&#xff08;项目符号&#xff09;列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中&#xff…

右键添加:新建HTML模板文件

使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了&#xff0c;但是没有引用模板文件&#xff0c;是空文件。 默认改成 htmlfile 模板成功

Windows10配置OpenJDK11

下载 # 华为OpenJDK镜像源 https://mirrors.huaweicloud.com/openjdk/11.0.2/解压 # 解压后至于C:\Dev\Env\Java\jdk-11.0.2目录下 https://mirrors.huaweicloud.com/openjdk/11.0.2/openjdk-11.0.2_windows-x64_bin.zip编译安装 # 以管理员身份运行 CMD命令提示符 并进入JD…

统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架

目录 一、摘要 二、引言 三、相关工作 开放词汇对象检测 开放世界目标检测 参数高效学习 四、高效通用的开放世界目标检测 问题定义 高效的自适应决策学习 开放世界通配符学习 五、Coovally AI模型训练与应用平台 六、实验 数据集 评价指标 实施细节 定量结果 …

如何给商品一键换色?图生生AI,告别繁琐修图

在电商竞争日益激烈的今天&#xff0c;商品图片的视觉效果直接影响着消费者的购买决策。而商品颜色的展示&#xff0c;更是重中之重&#xff01;传统的图片换色方式&#xff0c;往往需要耗费设计师大量的时间和精力&#xff0c;从抠图到调色&#xff0c;再到细节调整&#xff0…

练习-班级活动(map存储键值对)

问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n 以内的正整数作为 id&#xff0c;第 i 名同学的 id 为 ai​。 老师希望…

OpenHarmony 开源鸿蒙北向开发——hdc工具安装

hdc&#xff08;OpenHarmony Device Connector&#xff09;是为开发人员提供的用于设备连接调试的命令行工具&#xff0c;该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备&#xff08;或模拟器&#xff09;进行连接调试通信。简单来讲&#xff0c;hdc 是 Op…

buu-bjdctf_2020_babystack2-好久不见51

整数溢出漏洞 将nbytes设置为-1就会回绕&#xff0c;变成超大整数 从而实现栈溢出漏洞 环境有问题 from pwn import *# 连接到远程服务器 p remote("node5.buuoj.cn", 28526)# 定义后门地址 backdoor 0x400726# 发送初始输入 p.sendlineafter(b"your name…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…

Unix 域套接字(本地套接字)

Unix 域套接字&#xff08;Unix Domain Sockets&#xff09;&#xff0c;也称为本地套接字&#xff08;Local Sockets&#xff09;&#xff0c;是一种用于同一主机上进程间通信&#xff08;IPC&#xff09;的机制。Unix 域套接字提供了一种高效的进程间通信方式&#xff0c;它利…

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…

LangChain开发(一)介绍和第一个例子

文章目录 简介LangChain框架组成LangChain库&#xff08;Libraries&#xff09;LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息&#xff08;Message&#xff09;4. 提示&#xff08;prompts&#xff09;5. 输出解析器&#xff08;Output Parsers&#xff09;6.Ret…

Chrome-Edge-IDEA-Win 常用插件-工具包

Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…

电加热产品亚马逊审核标准UL499报告

很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准&#xff0c;因此亚马逊出于对安全的考虑会加强对带电的…

从实践到创新:低代码驱动教育行业数字化转型

随着数字化转型浪潮席卷教育领域&#xff0c;低代码开发平台因其“低门槛、高效率、强适配”特性&#xff0c;正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例&#xff0c;分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…