当前位置: 首页 > 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;但还…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

篇章二 论坛系统——系统设计

目录 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) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...