单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

__new__()__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例

在 Python 中,我们可以用多种方法来实现单例模式:

  • 使用模块
  • 使用 __new__
  • 使用装饰器(decorator)
  • 使用元类(metaclass)

其实,python的模块就是天然的单例模式

# mysingleton.py
class My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()以上保存为mysingleton.py文件from mysingleton import my_singleton
my_singleton.foo()

__new__方法:

class Singleton(object):_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return  cls._instance
class Myclass(Singleton):a = 1one = Myclass()
two = Myclass()
print(one == two)
print(id(one), id(two))    #id是查看变量,对象的内存地址,是一串数字号码组成。
output:
True
140681619835480 140681619835480

使用装饰器:

from functools import wrapsdef singleton(cls):instances = {}@wraps(cls)def getinstance(*args, **kw):if cls not in instances:instances[cls] = cls(*args, **kw)return instances[cls]return getinstance@singleton
class MyClass(object):a = 1one = MyClass()
two = MyClass()
print(one == two)
print(id(one), id(two))
output:
True
140282556684664 140282556684664

使用元类__metaclass__:

class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)return cls._instances[cls]
#python2
class Myclass(object):__metaclass__ = Singleton#python3
class Myclass(metaclass = Singleton):passone = Myclass()
two = Myclass()
print(one == two)
print(id(one), id(two))output:
True
140493683038808 140493683038808
id值是不断变化的,但one和two两者id始终都是相等的。

python单例模式学习相关推荐

  1. 【Python】Python语言学习:设计模式、单例模式

    01 设计模式 1.1 设计模式简介 设计模式是解决特定问题的解决方案. 设计模式的优点: 1 可以在多个项目重复使用. 2 问题可以在架构级别来解决. 3 经过了时间的验证和良好的证明,是开发人员和 ...

  2. python最简单单例模式_5种Python单例模式的实现方式

    本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new ...

  3. Python总结-学习方向和方法

    目录 前言... 2 (一)如何学习Python. 2 (二)一些Python免费课程推荐... 3 (三)Python爬虫需要哪些知识?... 4 (四)Python爬虫进阶... 6 (五)Pyt ...

  4. 熬夜整理了2021年Python最新学习资料,分享给学弟学妹们【大学生必备】

    Python最新学习资料和视频 一.Python软件 安装教程 视频教程 二.学习规划 阶段一:Python基础 阶段二:Python核心编程 阶段三:web前端开发 阶段四:数据库 阶段五:后端开发 ...

  5. python+人工智能学习线路

    小白学Python最苦恼的是路线怎么走,怎样才不会走弯路,这里分享一份Python+人工智能的学习方案及目标.感兴趣的可以看看. 第一阶段 Python核心编程 学习内容技术要点 计算机组成原理认识操 ...

  6. Python基础学习-方法

    Python基础学习-方法 方法的重载 方法的动态性 私有属性和私有方法(实现封装) 私有方法 @property装饰器 面向对象的三大特征介绍 继承 语法格式 类成员的继承和重写 查看类的继承层次结 ...

  7. python单例模式代码-5种Python单例模式的实现方式

    本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new ...

  8. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  9. Python深度学习:基于TensorFlow

    作者:吴茂贵,王冬,李涛,杨本法 出版社:机械工业出版社 品牌:机工出版 出版时间:2018-10-01 Python深度学习:基于TensorFlow

  10. Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]

    作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...

最新文章

  1. 【C++】Google C++编码规范(一):作用域
  2. [微信小程序]商城之购买商品数量实现
  3. 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结
  4. php libev pthreads,libuv 与 libev 的对比
  5. opencv-python视频处理之录制视频
  6. 征战蓝桥 —— 2016年第七届 —— C/C++A组第5题——消除尾一
  7. IOS开发笔记之十七——一个关于工程目录读写权限的问题
  8. cf1132E. Knapsack(搜索)
  9. 用java编写一个计算器_用java程序编写一个计算器
  10. objective-c 使用NSNumber 将int float long等数据类型加入到数组或字典中
  11. 从背包问题优化详解动态规划思想
  12. python3 批量修改文件扩展名——递归
  13. Spring MVC Maven 环境搭建与部署
  14. app怎么调用mysql数据_数据库: 安装配置数据库,使用Navicat for MySQL和手机APP 连接测试...
  15. [轉]winrar的命令行
  16. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中练习-自定义函数模型拼接...
  17. spring 的web.xml的加载顺序
  18. 4、Android 主流数据库框架
  19. 8类网线利弊_八类网线用过吗?与超五类、六类等网线有啥区别?
  20. 乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)

热门文章

  1. user guide for Coverity Wizard
  2. 如何在Web页面里使用高拍仪扫描上传图像
  3. Android WebView实现长截图
  4. HTML如何长截图谷歌,『技巧』如何利用Chrome进行网页长截图
  5. java 修改pdf文档的页面的大小
  6. Python制作动态爱心函数动图
  7. DTCC 年度最佳创新产品丨真正的 HTAP 数据库是怎样炼成的?
  8. 学信号处理要理解均值、平均偏差、标准差、方差
  9. OpenLayers叠加天地图矢量、影像、注记
  10. 最新最全的云开发入门教程,微信小程序云开发,云函数,云数据库学习,微信小程序云开发扩展功能学习