Day23笔记-Day21和Day22作业讲解单例类
Day22作业讲解
'''
学生类Student:属性:学号,姓名,年龄,性别,成绩
班级类 Grade:属性:班级名称,班级中的学生 【使用列表存储学生】
方法:1.查看该班级中的所有学生的信息2.查看指定学号的学生信息3.查看班级中成绩不及格的学生信息4.将班级中的学生按照成绩降序排序
'''
class Student():__slots__ = ('sid','name','age','score')def __init__(self,sid,name,age,score):self.sid = sidself.name = nameself.age = ageself.score = scoredef __repr__(self):return f'{self.sid}-{self.name}-{self.score}'
class Grade():__slots__ = ('grade_name','stus_list')def __init__(self,grade_name,stus_list):self.grade_name = grade_nameself.stus_list = stus_list # 将学生的对象添加到列表中def show_all(self):print('所有学生的信息如下:')for stu in self.stus_list:print(stu) # 调用__init__或__repr__def show_single(self,sid):print(f'学号为{sid}的学生的信息如下:')for stu in self.stus_list:if stu.sid == sid:print(stu)breakelse:print('不存在')def show_low(self):print('不及格学生的信息如下:')for stu in self.stus_list:if stu.score < 60:print(stu)def sort_by_score(self):print('降序排序之后的信息如下:')self.stus_list.sort(reverse=True,key=lambda stu:stu.score)self.show_all()
if __name__ == '__main__':s1 = Student('1003','小明',19,88)s2 = Student('1001', '小王', 17, 100)s3 = Student('1005', '小李', 19, 56)s4 = Student('1006', '小张', 20, 99)s5 = Student('1002', '小赵', 18, 60)
grade = Grade('千锋2401',[s1,s2,s3,s4,s5])grade.show_all()grade.show_single('1006')grade.show_low()grade.sort_by_score()
一、单例设计模式【重点掌握】
1.概念
什么是设计模式?
设计模式是经过总结、优化的,对我们经常会碰到的一些编程问题的可重用解决方案
设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板。设计模式不会绑定具体的编程语言
23种设计模式,其中比较常用的是单例设计模式,工厂设计模式,代理模式,装饰者模式等等
什么是单例设计模式?
单例:单个实例/单个对象,一个类只能创建一个对象,只能创建出一个对象的类被称为单例类
程序运行过程中,确保某一个类只有一个实例【对象】,不管在哪个模块获取这个类的对象,获取到的都是同一个对象。例如:一个国家只有一个主席,不管他在哪
单例设计模式的核心:一个类有且仅有一个实例,并且这个实例需要应用于整个程序中,该类被称为单例类
问题:验证两个变量中是否存储的是同一个对象
解决:地址
方式一:x1 is x2
方式二:id(x1) == id(x2)
2.应用场景
应用程序中描述当前使用用户对应的类 ———> 当前用户对于该应用程序的操作而言是唯一的——> 所以一般将该对象设计为单例
实际应用:数据库连接池操作 ——> 应用程序中多处地方连接到数据库 ———> 连接数据库时的连接池只需一个就行,没有必要在每个地方都创建一个新的连接池,这种也是浪费资源 ————> 解决方案也是单例
3.实现
3.1实现单例类方式一
# 1.普通类
class Person():pass
p1 = Person()
p2 = Person()
print(p1 is p2) # False
print(id(p1) == id(p2)) # Flase
print('*' * 50)
# 2.单例类
'''
__new__
__init__
'''
class Person():# 定义一个类属性,用于表示当前类可以创建的唯一的对象# 因为此类属性无需在类的外面被访问修改,则设置为私有属性__instance = Nonedef __new__(cls, *args, **kwargs):print('new~~~')# 只要super().__new__(cls)被执行一次,则会创建出一个新的对象# 判断__instance的值,如果为None,则重新赋值为对象并返回,如果非空则直接返回if not cls.__instance:print('if~~~~')cls.__instance = super().__new__(cls)return cls.__instance
def __init__(self,name,age):print('init~~~~',name,age)self.name = nameself.age = age
p1 = Person('张三',10) # 创建对象
p2 = Person('李四',20) # 获取第一次创建的对象,此处的李四和20相当于给对象的name和age属性重新赋值
print(p1 is p2) # True
print(id(p1) == id(p2)) # True
print(p1.name,p2.name) # 李四
p1.name = 'Jack'
print(p1.name,p2.name)
3.2装饰器装饰类
.装饰器装饰类
def wrapper(cls): # cls表示需要被装饰的类def inner(*args,**kwargs):c = cls(*args,**kwargs) # 类(),创建对象:调用类中的构造函数__new__,__init__,所以此处的参数需要和__init__中的参数保持一致print('new~~~') # 新增的功能return creturn inner
@wrapper # 调用外部函数wrapper
class A():def __init__(self,name,age):self.name = nameself.age = age
print(A) # <function wrapper.<locals>.inner at 0x000001DF7EDCC430>
a1 = A('111',10) # 调用inner,a1中存储的是inner的返回值,为了符合最初创建对象的语法,则给inner设置返回值
print(a1)
3.3实现单例类方式二
def singleton(cls):# 定义一个函数作用域的变量,用于存储被装饰的类可以创建的唯一的对象instance = Nonedef get_instance(*args,**kwargs):nonlocal instanceif not instance:instance = cls(*args, **kwargs) # 调用__init__return instancereturn get_instance
@singleton
class Person():def __init__(self,name,age):print('init~~~~~',name,age)self.name = nameself.age = age
p1 = Person('张三',10) # 调用get_instance
p2 = Person('李四',20) # 调用get_instance
print(p1 is p2) # True
print(id(p1) == id(p2)) # True
print(p1.name,p2.name) # 张三
p1.name = 'Jack'
print(p1.name,p2.name)
3.4实现单例类方式三
def singleton(cls):# 定义一个函数作用域的字典变量,key:被装饰的类,value:唯一的对象instance = {}def get_instance(*args,**kwargs):if not instance:# 向字典中添加键值对instance[cls] = cls(*args, **kwargs) # 调用__init__return instance[cls]return get_instance
@singleton
class Person():def __init__(self,name,age):print('init~~~~~',name,age)self.name = nameself.age = age
p1 = Person('张三',10) # 调用get_instance
p2 = Person('李四',20) # 调用get_instance
print(p1 is p2) # True
print(id(p1) == id(p2)) # True
print(p1.name,p2.name) # 张三
p1.name = 'Jack'
print(p1.name,p2.name)
相关文章:
Day23笔记-Day21和Day22作业讲解单例类
Day22作业讲解 学生类Student:属性:学号,姓名,年龄,性别,成绩 班级类 Grade:属性:班级名称,班级中的学生 【使用列表存储学生】 方法:1.查看该班级中的所有学生的信息2.查看指定学号的学生信息3.查看班级中成绩不…...
k8s中的存储
目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…...
【Linux进程控制】进程程序替换
目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用(部分),并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…...
02 ETH
以太坊与比特币有什么不同? 以太坊立足比特币创新之上,于 2015 年启动,两者之间有一些显著不同。 比特币就仅仅是比特币;以太坊包括以太币,以太币才是和比特币对等的存在。以太坊是可编程的,所以你可以在…...
web渗透—RCE
一:代码执行 相关函数 1、eval()函数 assert()函数 (1)原理:将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过:闭合注释;开启GPC的话就无法绕过(GPC就是将单引号转换为"反斜杠单引号"&a…...
HomeAssistant显示节假日
先看效果 步骤: 新建卡片时选择“Markdown 卡片”代码在文章最下方,当然你也可以自己修改 点击保存/完成 ### {% if now().hour > 6 and now().hour < 9 -%} 早上好, {%- elif now().hour > 9 and now().hour < 12 -%} 上午好…...
AI问答-HTTP:理解 Content-Disposition
本文背景 在下载arraybuffer文件时,想要获取文件名,这时引入本文内容Content-Disposition,我们在Content-Disposition获取到文件名就可以在下载后的文件以该文件名命名了。 一、简介 Content-Disposition是HTTP协议中的一个响应头字段&…...
kubernetes架构
kubernetes cluster由master和node组成,节点上运行着若干kubernetes服务Master节点: master是kubernetes cluster的大脑,运行着的Daemon服务包括kube-apiserver,kube-scheduler,kube-controller-manager,etcd和Pod网络…...
【隐私计算篇】中国剩余定理解释以及Paillier解密加速应用
1. 背景介绍 本篇主要关注中国剩余定理的原理以及在paillier同态加密系统中的应用。在很多工作中,都可以看到中国剩余定理的影子,特别是同态加密提升计算效率的优化工作中,将paillier与中国剩余定理进行结合,能够实现在加密状态下…...
保护您的隐私:隐藏 IP 地址的重要性
在当今的数字时代,我们的在线隐私和安全变得比以往任何时候都更加重要。浏览互联网时保护自己的一种方法是隐藏您的 IP 地址。 但是为什么要隐藏您的 IP 地址以及如何有效地做到这一点? 隐藏您的 IP 地址有助于保护您的在线匿名性。您的 IP 地址就像您的…...
nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink
完整错误信息 npm error Error: EPERM: operation not permitted, symlink npm warn cleanup Failed to remove some directories [ npm warn cleanup [ npm warn cleanup C:\\Users\\kingchuxing\\Documents\\IPFS\\orbit-db-set-master\\node_modules\\ipfs-cli, npm…...
Rsync未授权访问漏洞复现及彻底修复
一、什么是 Rsync? Rsync 是一种广泛使用的文件传输工具,它允许系统管理员和用户通过局域网(LAN)或广域网(WAN)在计算机之间同步文件和目录。Rsync 支持通过本地或远程 shell 访问,也可以作为守…...
影刀RPA实战:网页爬虫之携程酒店数据
1.实战目标 大家对于携程并不陌生,我们出行定机票,住酒店,去旅游胜地游玩,都离不开这样一个综合性的网站为我们提供信息,同时,如果你也是做旅游的公司,那携程就是一个业界竞争对手,…...
【UCB CS61C】Lecture 5 - Floating Point
目录 引入浮点数(Floating Point)定点表示法(Fixed-Point Model)科学记数法(Scientific Notation)记数法间的转换 IEEE 754 二进制浮点数算术标准实现目标单精度浮点编码阶码字段(The Exponent …...
【Binlog实战】:基于Spring监听Binlog日志
【Binlog实战】:基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志(binlog)有三种不同的格式,通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式: 在 …...
鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例
轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统,提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwip、l…...
基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图
目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程(使用模拟数据),我们将使用以下技术: Spri…...
Rasa对话模型——做一个语言助手
1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架,主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解(NLU)和对话管理(DM)功能,使开发者能够创建智能、交互式的对话系统。 1.2…...
golang学习笔记19——golang做服务发现与注册的深度剖析
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
ROS和ROS2借助智能大模型的学习和研究方法
机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
