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年中秋,智能模型实力已经如此,但还…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
旋量理论:刚体运动的几何描述与机器人应用
旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比,旋量理论通过螺旋运动的概念统一了旋转和平移,在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观,而且计算…...
