python 单例模式的四种实现方法

DAY 13. 单例设计

13.1 什么是单例设计

一个类每次实例化返回的都是同一个对象,这种设计模式叫做单例设计,这个类叫做单例类

13.2 实现单例设计的方法

13.2.1 重写__new__()

class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次实例化,返回一个新对象if not hasattr(cls, '_object'):cls._object = super().__new__(cls)return cls._objectdef __init__(self, name):self.name = namedef Print(self):print(f'The name of this object is: {self.name}')if __name__ == '__main__':foo1 = Foo('foo1')foo2 = Foo('foo2')foo3 = Foo('foo3')foo1.Print()  # The name of this object is: foo3foo2.Print()  # The name of this object is: foo3foo3.Print()  # The name of this object is: foo3

13.2.2 使用装饰器

def singleton(cls):singleton_dict = {}def close(*args, **kwargs):# 利用字典的setdefault()方法,如果第一次实例化就加入字典,以后每次都返回这个对象return singleton_dict.setdefault('obj',cls(*args, **kwargs))return close@singleton
class MyClass:passif __name__ == '__main__':foo1 = MyClass()foo2 = MyClass()print(foo1)  # <__main__.MyClass object at 0x000001DF618C8940>print(foo2)  # <__main__.MyClass object at 0x000001DF618C8940>

13.2.3 使用模块

用import导入的模块就是天然的单例模式,如果想要实现一个单例类,不妨把它作为一个独立的模块,使用时导入由他实例化出来的对象

# mysingleton.py
class My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()# to use
from mysingleton import my_singletonmy_singleton.foo()

13.2.4 共享属性

共享属性是指所有由“单例类”实例化出来的对象都共享“同一份属性”,也就是所有对象的__dict__都指向同一个字典,但这样严格来说并不算真的单例模式,因为这样还是有多个实例对象,但其行为确实和单例模式一样

class Foo:_mydict = {}def __new__(cls, *args, **kwargs):ob = super().__new__(cls)ob.__dict__ = cls._mydictreturn obif __name__ == '__main__':foo1 = Foo()foo2 = Foo()foo1.name = 'foo1'print(foo2.name)  # foo1# foo1 和 foo2 并不是同一个对象,只不过他们的方法和属性公用同一块内存print(foo1)  # <__main__.Foo object at 0x0000023ADA4A8A90>print(foo2)  # <__main__.Foo object at 0x0000023ADA4A8AC8>

13.3 总结

  • 什么是单例模式
    • 单例,即单个实例,一个类在实例化的过程中始终返回同一个实例
  • 实现单例模式的四种方法
    • 重写__new__(cls)方法,该方法是一个类方法,用来为实例开辟内存空间,返回值是实例化对象,通过重写该方法,可以使每次实例化都返回同一个对象
    • 修饰器方法:与之前修饰器那一节的斐波那契数列类似,判断字典中有没有对象,有的话就直接返回,没有才实例化
    • 模块:这是最简单的方法,直接导入实例化对象
    • 共享属性:通过把所有对象的__dict__指向同一块内存空间来实现,虽然不是“一个实例”,但其行为与“一个实例”一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis3.2.5部署(单节点)

1.安装jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字节跳动 设计模式 pdf_凭这份pdf我拿下了美团、字节跳动、阿里、小米等大厂的offer...

关于程序员&#xff0c;除了做项目来提高自身的技术之外&#xff0c;还有一种提升自己的专业技能就是&#xff1a;多&#xff01;看&#xff01;书&#xff01;小编整理出一篇Java进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n  m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

这道题要注意的是两个线程唤醒和等待的顺序&#xff0c;应为第一个线程会比第二个线程更早结束&#xff0c;所以如果第一个线程已经结束&#xff0c;而第二个线程还在等待被唤醒&#xff0c;那第二个线程会一直等待下去&#xff0c;因此第一个线程要先等待后唤醒&#xff0c;这…

项目开发容易出错情况统计

2016年11月17日 11:30:45 星期四 1.适配&#xff1a; a) APP弹窗大屏幕适配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按钮状态&#xff1a; a) 按钮点击后没有disable 如果新页面加载卡顿导致用户多次点击&#xff0c;生成多次请求 b) 按钮disable后什么时候enabl…

python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载&#xff0c;转载请联系出处。人生苦短&#xff0c;我该不该选择Python&#xff1f;编程语言几年一变样&#xff0c;榜单之争也是愈演愈烈&#xff0c;还架不住时不时杀出个黑马……而对于Python&#xff0c;自2010年初以来一直蓬…

android 音频播放总结 soundlPool,MediaPlay

soundlPool 用于小音频的播放多个同时播放。 使用步骤&#xff1a; 步骤一&#xff1a; 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下&#xff0c;区别在于assets下可以再新建文件夹而raw不行&#xff0c;assets内部单个文件超过1m时可能存在bug而raw不会…

文本分析软件_十大针对机器学习的文本注释工具与服务,你选哪个?

房地产和键【51CTO.com快译】目前&#xff0c;从搜索引擎与情感分析&#xff0c;到虚拟助手与聊天机器人&#xff0c;机器学习应用场景中的许多研究领域&#xff0c;都需要通过文本注释工具与服务来提供准确性。在AI研究与开发行业中&#xff0c;发现或创建可注释的数据对于项目…

sqlite创建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收机制

DAY 18. python垃圾回收机制 python GC主要有三种方式 引用计数标记清除分代回收 其中&#xff0c;以引用计数为主。 18.1 引用计数&#xff08;Reference Counting&#xff09; 《寻梦环游记》中说&#xff0c;人一生会经历两次死亡&#xff0c;一次是肉体死的时候&#…

曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家

荷重位移曲线仪广泛适用于各种按键及开关、DOME片、按键、微力弹片、硅胶按键、汽车开关之荷重-行程测定&#xff1b;Windows中英文双语软件&#xff0c;操作简单方便&#xff0c;软件流畅稳定&#xff0c;所有测试资料(测试条件&#xff0c;曲线&#xff0c;数据结果&#xff…

进程调度

1、策略 策略决定调度程序在何时让什么进程运行。调度器的策略往往决定系统的整体印象&#xff0c;并且&#xff0c;还要负责优化使用处理器时间。 1.1 I/o消耗型和处理器消耗型。 进程可以被分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或者等待I/O请…

Django,Ajax,Vue实现文章评论功能

Django评论 评论复杂的地方在于需要实现点击提交评论后评论内容需要立刻出现在下面&#xff0c;还要保持页面位置不变&#xff0c;所以提交后不能整体刷新页面&#xff0c;因为刷新以后页面肯定在最上面&#xff0c;而评论一般都在最下面&#xff0c;所以要用到Ajax 整个过程用…

回归分析什么时候取对数_冬蜜什么时候取,冬天取蜂蜜的方法

大家好&#xff0c;我现在分享的是&#xff0c;在冬天是在什么时候取蜜&#xff01;冬天在我们南方&#xff0c;取蜜时间是十一月到十二月的时候&#xff0c;只要温度达到15度以上&#xff0c;蜂蜜封盖了就可以取蜜了&#xff0c;并且在冬天我们只能取一次&#xff0c;最晚取蜜…

Opencv与dlib联合进行人脸关键点检测与识别

前言 依赖库&#xff1a;opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置&#xff0c;重点在实现上。使用libfacedetection实现人脸区域检测&#xff0c;联合dlib标记人脸特征点&#xff0c;最后使用opencv的FaceRecognizer实现人脸识别。 准备工作 1、配置好Op…

Category 的一些事

来源&#xff1a;伯乐在线 - Tsui YuenHong 链接&#xff1a;http://ios.jobbole.com/90422/ 点击 → 申请加入伯乐在线专栏作者 新增实践部分&#xff1a;偏方 Hook 进某些方法来添加功能 Category – 简介 Category&#xff08;类别&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征变换_机器学习的“万能模板” - 数据分析

最后是文本变量。很遗憾Titanic数据集中没有合适的文本变量。一般我们处理文本变量的方法是&#xff0c;合并所有的文本形成一个变量&#xff0c;然后调用Count Vectorizer或者TfidfVectorizer算法&#xff0c;将文本数据转换成数字。大部分情况下&#xff0c;TfidfVectorizer比…

python实现哈希表

# python 实现哈希表class HashTable:"""哈希函数的构造解决冲突"""def __init__(self, source):self.source sourceself._index []self._val []self.table []self._mod 13def Output(self):print(self._index)print(self._val)def _create…

商品综合评价排名

店内有很多产品&#xff0c;而且包含但不局限于以下指标&#xff1a;浏览量、访客数、平均停留时长、详情页跳出率、下单转化率、下单支付转化率、支付转化率、下单金额、下单商品件数、下单买家数、支付金额、支付商品件数、加购件数、访客平均价值、收藏人数、客单价、搜索支…

ionic资源网站

http://ionichina.com/topic/570b1f4ecd63e4247a7cfcf3 http://doc.ionicmaterialdesign.com/#intro http://ionicmaterial.com/demo/ 10大materialhttp://www.open-open.com/news/view/192f93e转载于:https://www.cnblogs.com/znsongshu/p/6079357.html