当前位置: 首页 > news >正文

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:属性:学号&#xff0c;姓名&#xff0c;年龄&#xff0c;性别&#xff0c;成绩 ​ 班级类 Grade:属性:班级名称&#xff0c;班级中的学生 【使用列表存储学生】 ​方法: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*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…...

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…...

web渗透—RCE

一&#xff1a;代码执行 相关函数 1、eval()函数 assert()函数 (1)原理&#xff1a;将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过&#xff1a;闭合注释&#xff1b;开启GPC的话就无法绕过&#xff08;GPC就是将单引号转换为"反斜杠单引号"&a…...

HomeAssistant显示节假日

先看效果 步骤&#xff1a; 新建卡片时选择“Markdown 卡片”代码在文章最下方&#xff0c;当然你也可以自己修改 点击保存/完成 ### {% if now().hour > 6 and now().hour < 9 -%} 早上好&#xff0c; {%- elif now().hour > 9 and now().hour < 12 -%} 上午好…...

AI问答-HTTP:理解 Content-Disposition

本文背景 在下载arraybuffer文件时&#xff0c;想要获取文件名&#xff0c;这时引入本文内容Content-Disposition&#xff0c;我们在Content-Disposition获取到文件名就可以在下载后的文件以该文件名命名了。 一、简介 Content-Disposition是HTTP协议中的一个响应头字段&…...

kubernetes架构

kubernetes cluster由master和node组成&#xff0c;节点上运行着若干kubernetes服务Master节点&#xff1a; master是kubernetes cluster的大脑&#xff0c;运行着的Daemon服务包括kube-apiserver&#xff0c;kube-scheduler,kube-controller-manager&#xff0c;etcd和Pod网络…...

【隐私计算篇】中国剩余定理解释以及Paillier解密加速应用

1. 背景介绍 本篇主要关注中国剩余定理的原理以及在paillier同态加密系统中的应用。在很多工作中&#xff0c;都可以看到中国剩余定理的影子&#xff0c;特别是同态加密提升计算效率的优化工作中&#xff0c;将paillier与中国剩余定理进行结合&#xff0c;能够实现在加密状态下…...

保护您的隐私:隐藏 IP 地址的重要性

在当今的数字时代&#xff0c;我们的在线隐私和安全变得比以往任何时候都更加重要。浏览互联网时保护自己的一种方法是隐藏您的 IP 地址。 但是为什么要隐藏您的 IP 地址以及如何有效地做到这一点&#xff1f; 隐藏您的 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&#xff1f; Rsync 是一种广泛使用的文件传输工具&#xff0c;它允许系统管理员和用户通过局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;在计算机之间同步文件和目录。Rsync 支持通过本地或远程 shell 访问&#xff0c;也可以作为守…...

影刀RPA实战:网页爬虫之携程酒店数据

1.实战目标 大家对于携程并不陌生&#xff0c;我们出行定机票&#xff0c;住酒店&#xff0c;去旅游胜地游玩&#xff0c;都离不开这样一个综合性的网站为我们提供信息&#xff0c;同时&#xff0c;如果你也是做旅游的公司&#xff0c;那携程就是一个业界竞争对手&#xff0c;…...

【UCB CS61C】Lecture 5 - Floating Point

目录 引入浮点数&#xff08;Floating Point&#xff09;定点表示法&#xff08;Fixed-Point Model&#xff09;科学记数法&#xff08;Scientific Notation&#xff09;记数法间的转换 IEEE 754 二进制浮点数算术标准实现目标单精度浮点编码阶码字段&#xff08;The Exponent …...

【Binlog实战】:基于Spring监听Binlog日志

【Binlog实战】&#xff1a;基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种不同的格式&#xff0c;通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式&#xff1a; 在 …...

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…...

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…...

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架&#xff0c;主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解&#xff08;NLU&#xff09;和对话管理&#xff08;DM&#xff09;功能&#xff0c;使开发者能够创建智能、交互式的对话系统。 1.2…...

golang学习笔记19——golang做服务发现与注册的深度剖析

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

ROS和ROS2借助智能大模型的学习和研究方法

机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值&#xff0c;需要基于知识应用和创新才有价值。 学历报废并非来自扩招&#xff0c;而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋&#xff0c;智能模型实力已经如此&#xff0c;但还…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...