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

python---设计模式

python中设计模式-单例模式

基于__new__方法实现

第一个设计:
class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 = MySingleton()
mysingleton2 = MySingleton()
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)

输出结果:

None

None

1601545424

1601545424

True

此时连个对象是同一个对象,但是都是None,也就是没有进行实例化,失败。

第二个设计:
class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):# 创建对象,并返回return super(MySingleton, cls).__new__(cls)mysingleton1 = MySingleton()
mysingleton2 = MySingleton()
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)

输出结果:

<__main__.MySingleton object at 0x0000024BEB827A20>

<__main__.MySingleton object at 0x0000024BEB827AC8>

2525096999456

2525096999624

False

创建了对象,但是却创建了两次,失败。

第三个设计:
class MySingleton:__instance = Nonedef __init__(self, name, age):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance不为None,则直接返回它的值if cls.__instance:return cls.__instance# 如果类属性__instance是None# 创建对象,并返回cls.__instance = super(MySingleton, cls).__new__(cls)return cls.__instancemysingleton1 = MySingleton(name='zhangsan', age=25)
mysingleton2 = MySingleton(name='lisi', age=35)
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)
# mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
print(mysingleton1.name, str(mysingleton1.age))
print(mysingleton2.name, str(mysingleton2.age))

输出结果:

调用了__init方法__

调用了__init方法__

<__main__.MySingleton object at 0x000001F49B877400>

<__main__.MySingleton object at 0x000001F49B877400>

2150092993536

2150092993536

True

lisi 35

lisi 35

是同一个对象,但是第二次赋值'lisi'覆盖了'zhangsan'的赋值,失败。

第四个设计:
class MySingleton:__instance = Nonedef __init__(self, name, age):# 如果对象没有'name‘属性,就赋值,否则不赋值if not hasattr(self, 'name'):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance不为None,则直接返回它的值if cls.__instance:return cls.__instance# 如果类属性__instance是None# 创建对象,并返回cls.__instance = super(MySingleton, cls).__new__(cls)return cls.__instancemysingleton1 = MySingleton(name='zhangsan', age=25)
mysingleton2 = MySingleton(name='lisi', age=35)
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)
# mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
print(mysingleton1.name, str(mysingleton1.age))
print(mysingleton2.name, str(mysingleton2.age))

输出结果:

调用了__init方法__

调用了__init方法__

<__main__.MySingleton object at 0x000002B02C8A7A20>

<__main__.MySingleton object at 0x000002B02C8A7A20>

2955684772384

2955684772384

True

zhangsan 25

zhangsan 25

同一个对象,值也没有发生覆盖,算是成功。

但是如果多线程情况呢?

第五个设计(了解):
import threadingclass MySingleton:__instance = None__instence_lock = threading.Lock()def __init__(self, name, age):# 如果对象没有'name‘属性,就赋值,否则不赋值if not hasattr(self, 'name'):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance为Noneif not cls.__instance:# 代码块加锁,线程排队后再次判断是否为Nonewith MySingleton.__instence_lock:if not cls.__instance:# 如果类属性__instance是None,创建对象cls.__instance = object.__new__(cls)return cls.__instancedef __str__(self):# 类似java的toStringreturn str(id(self)) + " [name] = " + self.name + " [age] = " + str(self.age)# 类似java的Thread中的run方法
def task(name, age):obj = MySingleton(name=name, age=age)print(obj)for i in range(50):thread = threading.Thread(target=task, args=['name' + str(i), 30 + i])thread.start()

python中设计模式-工厂模式

简单工厂模式:

class Car(object):def run(self):print("__轿车__在跑")class Benz(Car):def run(self):print("[奔驰]在跑")class Bmw(Car):def run(self):print("[宝马]在跑")class Audi(Car):def run(self):print("[奥迪]在跑")class User(object):def __init__(self, name):self.name = namedef drive(self, car):print(self.name, "驾驶", end='')car.run()user = User('张三')
user.drive(Audi())
user.drive(Bmw())
user.drive(Benz())class Factory(object):@staticmethoddef get_tool(toolname):if 'benz' == toolname:return Benz()elif 'bmw' == toolname:return Bmw()elif 'audi' == toolname:return Audi()else:return Car()print()user.drive(Factory.get_tool('audi'))
user.drive(Factory.get_tool('bmw'))
user.drive(Factory.get_tool('benz'))
user.drive(Factory.get_tool('hello'))

相关文章:

python---设计模式

python中设计模式-单例模式 基于__new__方法实现 第一个设计&#xff1a; class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 MySingleton() mysingleton2 MySingleton() print(mysingleton1) print(mysingleton2) print(id(…...

Java编写xml文件时,文件中特殊字符如何解决?

有一个使用Java创建XML文件的需求&#xff0c;但标签里面有以下特殊字符<、>、&等 在未解决之前&#xff0c;创建出的XML是这样的 <?xml version"1.0" encoding"UTF-8"?><actionlist><update><jobno>1111</jobno&…...

vue3 ts pinia openapi vue-query pnpm docker前端架构小记

1.引言 开发中&#xff0c;我们是否经常遇到以下痛点&#xff1a; 项目越大&#xff0c;启动和热更新越来越慢&#xff0c;启动都要花个3-5分钟以上没有类型保障&#xff0c;接口返回的Object不拿到真实数据都不知道有哪些字段&#xff0c;接手别人js项目(无类型)很痛苦需要手…...

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…...

3.30每日一题(多元函数微分学)

1、判断连续&#xff1a;再分界点的极限值等于该点的函数值&#xff1b; 如何求极限值&#xff1a; 初步判断&#xff1a;分母都为二次幂开根号&#xff0c;所以分母为一次幂&#xff1b;分子为二次&#xff0c;一般来说整体为0&#xff1b; 如何说明极限为零&#xff08;常用…...

《OSTEP》条件变量(chap30)

〇、前言 本文是对《OSTEP》第三十章的实践与总结。 一、条件变量 #include <pthread.h> #include <stdio.h> #include <assert.h>int buffer; int count 0; // 资源为空// 生产,在 buffer 中放入一个值 void put(int value) {assert(count 0);count 1…...

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引&#xff08;自行建立的index&#xff09;里&#xff0c;所以当select的是主键或二级索引就会很快&#xff0c;select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整&#xff0c;那我这个索引只起了前一半作用。 所以用复合索引&am…...

关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退

先说结论&#xff0c;我用的app cleaner 重新删除的pycharm &#xff0c;再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm&#xff0c;因为装不了新的插件&#xff0c;没办法就升级了。新装2023打开之后闪退&#xff0c;重启系统也不行&#xff0c;怀疑是一起破解…...

Django中如何让DRF的接口针对前后台返回不同的字段

在Django中&#xff0c;使用Django Rest Framework&#xff08;DRF&#xff09;时&#xff0c;可以通过序列化器&#xff08;Serializer&#xff09;和视图&#xff08;View&#xff09;的组合来实现前后台返回不同的字段。这通常是因为前后台对数据的需求不同&#xff0c;或者…...

【机器学习】Kmeans聚类算法

一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法&#xff0c;简单地说就是把相似的数据样本分到一组&#xff08;簇&#xff09;&#xff0c;聚类的过程&#xff0c;我们并不清楚某一类是什么&#xff08;通常无标签信息&#xff09;&#xff0…...

getid3 获取视频时长

1、首先&#xff0c;我们需要先下载一份PHP类—getid3https://codeload.github.com/JamesHeinrich/getID3/zip/master 2.我在laravel6.0 中使用 需要在composer.json 自动加载 否则系统访问不到 在命令行 执行 composer dump-autoload $getID3 new \getID3();//视频文件需要放…...

如何知道一个程序为哪些信号注册了哪些信号处理函数?

https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace...

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…...

jbase实现申明式事务

对有反射的语言&#xff0c;申明式事务肯定不可少。没必要没个人都try&#xff0c;catch写事务&#xff0c;写的不好的话还经常容易锁表&#xff0c;为此给框架引入申明式事务。申明式既字面意思&#xff0c;在需要事务的方法前面加一个申明&#xff0c;那么框架保证事务。 首…...

如何在在线Excel文档中规范单元格输入

在日常的工作中&#xff0c;我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能&#xff0c;它可以帮助用户规范单元格的输入&#xff0c;从而提…...

力扣138:随机链表的复制

力扣138&#xff1a;随机链表的复制 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…...

C语言左移与右移学习

在学习左移与右移之前&#xff0c;我们首先要学习两种移位运算&#xff1a;逻辑移位和算数移位。 逻辑位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用0补充。 算数位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用符号位补充。 左移 左移是高位溢出&#xff0c;低…...

asp.net core mvc之 视图

一、在控制器中找到匹配视图&#xff0c;然后渲染成 HTML 代码返回给用户 public class HomeController : Controller {public IActionResult Index(){return View(); //默认找 Views/Home/Index.cshtml &#xff0c;呈现给用户} &#xff5d; 二、指定视图 1、控制器 publ…...

ChatGLM3 tool_registry.py 代码解析

ChatGLM3 tool_registry.py 代码解析 0. 背景1. tool_registry.py 0. 背景 学习 ChatGLM3 的项目内容&#xff0c;过程中使用 AI 代码工具&#xff0c;对代码进行解释&#xff0c;帮助自己快速理解代码。这篇文章记录 ChatGLM3 tool_registry.py 的代码解析内容。 1. tool_re…...

js实现定时刷新,并设置定时器上限

定时器 在js中&#xff0c;有两种定时器&#xff1a; 倒计时定时器 倒计时定时器&#xff0c;也叫延时定时器或一次性定时器 功能&#xff1a;倒计时多长时间后执行某个动作 语法&#xff1a;setTimeout(function, timeout); 返回值&#xff1a;int类型&#xff0c;当前定时器…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...