单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

我们在使用class创建类的时候, 只会创建一个类对象, 但是, 当我们实例化这个类对象的时候, 一个类对象, 可以实例化出很多不同的对象, 而我们每次实例化出来一个对象, 就会在内存中重新分配一块空间, 而今天介绍的单例模式, 就是为了解决上述问题, 使得由一个类对象所实例化出来的全部对象都指向同一块内存空间.

要想弄明白为什么每个对象被实例化出来之后, 都会重新被分配出一块新的内存地址, 就要清楚一个python中的内置函数__new__(), 它跟__init__()一样, 都是对象在被创建出来的时候, 就自动执行的一个函数, init()函数, 是为了给函数初始化属性值的, 而__new__()这个函数, 就是为了给对象在被实例化的时候, 分配一块内存地址, 因此, 我们可以重写__new__()这个方法, 让他在第一次实例化一个对象之后, 分配一块地址, 在此后的所有实例化的其他对象时, 都不再分配新的地址, 而继续使用第一个对象所被分配的地址, 因此, 我们可以在类对象里, 定义一个类属性, 初始值设为None, 如果这个值是None就调用父类的__new__()方法, 为其分配地址, 并返回这个地址(__new__方法一定要返回一个地址)

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

每次实例化一个对象时,都会先调用 __new__() 创建一个对象,再调用 __init__() 函数初始化数据。因而,在 new 函数中判断 ExecSql类 是否已经实例化过,如果不是,调用父类的 new 函数创建实例;否则返回之前创建的实例。

_instance 作为类属性,保证了所有对象的 _instance 都是同一个,我们可以看到下面例子中多个实例化的内存地址是一样的,是最新实例的值

单例实际是当多处调用进行多次实例化时,当类已实例化过,直接用实例化好的对象,当类未实例化过时,进行实例化对象,多处调用进行多次实例化实际只发生了一次实例化,共用1个实例化对象内存地址,所以实例对象是一样的

class ExecSql(object):_instance=Nonedef __new__(cls,*args,**kwargs):print("实例化时优先调用new方法,创建实例对象,这个方法是实现单例")if cls._instance is None:cls._instance=super().__new__(cls)return cls._instancedef __init__(self,name,age):print("实例化时,初始化方法,初始化一些数据")self.name=nameself.age=agetest1 = ExecSql("橙子",18)
print(id(test1),id(test1.name),test1.name)test2 = ExecSql("柚子",33)
print(id(test1),id(test1.name),test1.name)
print(id(test2),id(test2.name), test2.name)"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
实例化时优先调用new方法,创建实例对象,这个方法是实现单例
实例化时,初始化方法,初始化一些数据
2668768588352 2668766898976 橙子
实例化时优先调用new方法,创建实例对象,这个方法是实现单例
实例化时,初始化方法,初始化一些数据
2668768588352 2668768524368 柚子
2668768588352 2668768524368 柚子Process finished with exit code 0

Python实现单例相关推荐

  1. Python(25)-单例设计模式

    单例设计模式 1.单例设计模式 2.__new__方法 3.初始动作只执行一次 本系列博文来自学习<Python基础视频教程>笔记整理,视屏教程连接地址:http://yun.itheim ...

  2. Python 之 单例

    单例 目标 单例设计模式 new 方法 Python 中的单例 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 ...

  3. python:单例设计模式

    学习目标: python单例设计模式 学习内容: 1.设计模式:前人工作的总结和提炼,针对某一特定问题的成熟的解决方案 使用设计模式:可重用代码.让代码更容易被他人理解.保证代码可靠性 2.单例设计模 ...

  4. python线程安全的单例_[python笔记] 单例的几种实现方式(线程安全)

    单例实现方式: 1.单例装饰器; 2.使用类: 3.使用元类 1.单例装饰器(非线程安全) 通过装饰器使一个类变成单例类,但是并非线程安全的,多线程状态下,每个线程创建不同的实例,因为没有加线程锁,所 ...

  5. python实现单例_Python 实现单例模式

    Python 实现单例模式 # 使用Python实现单例模式 # 方法一: 使用__new__方法 class SingleTon(object): def __new__(cls, *args, * ...

  6. 有没有简单优雅的方法来定义单例? [重复]

    这个问题已经在这里有了答案 : 在Python中创建单例 (22个答案) 去年关闭. 似乎有很多方法可以在Python中定义单例 . 关于堆栈溢出是否有共识? #1楼 Python文档确实涵盖了这一点 ...

  7. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件

    1.单例设计模式 单例设计模式就是为对象在内存中分配空间的时候,永远只会返回一个唯一的固定的内存空间.这样就能保证在内存中这个类的对象只有唯一的一份,这个就叫做单例.(为对象分配空间使用的是内置方法_ ...

  8. python编程入门单例_常见的在Python中实现单例模式的三种方法

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

  9. 在Python中创建单例

    这个问题不是为了讨论是否需要单例设计模式 ,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式. 在这种情况下,我定义"最pytho ...

最新文章

  1. Android 10.0 系统启动之SystemServer进程-[Android取经之路]
  2. python xpath语法-Python爬虫 | 解析库Xpath的使用
  3. 用 GDI 操作 EMF 文件[8]: 绘制图元文件时改变画笔与画刷
  4. 计算机怎么没有桌面文件夹名称大全,你的电脑文件总是找不到?是时候学习文件夹分类整理了...
  5. python解压打开文件过多_在python中使用zipfile压缩文件时层级很多,有很多层目录...
  6. iphone 调试技巧
  7. javascrip学习之 数据类型和变量
  8. “凡事不发朋友圈的人,都是过的不好的人”你认同这句话吗为什么?
  9. canvas 画点_css+canvas 随便画一个星空
  10. Java基础之数组练习
  11. Linux宝库名人轶事栏目 | 智能化之边缘计算浅析
  12. 利用wordpress搭建自己的网站(百度云虚拟主机)
  13. idea 设置文件忽略git版本控制
  14. Direct Sparse Visual-Inertial Odometry using Dynamic Marginalization
  15. git放弃本地修改:
  16. 班级小工具一【微信接龙】
  17. xin片设计的中的数学问题
  18. mongoDB——metadata之我见
  19. Ubuntu server安装ubuntu桌面,安装软件中心-ubuntu software
  20. oracle之归档日志空间管理

热门文章

  1. visual studio 判断dropdownlist选的是什么_心理测试:五个小蓝人,你选哪个?测你是不是一个容易追求的人...
  2. java muki_再次学习 java 类的编译
  3. python scikit learn 关闭开源_慕课|Python调用scikit-learn实现机器学习(一)
  4. JVM——对象的创建与内存布局
  5. vue添加html开启服务器_Vue 项目(HTML5 History 模式) 部署服务器
  6. html字符串变量,字符串变量中的Python HTML
  7. 基于java SSM图书管理系统简单版设计和实现
  8. linux dhcp服务软包,dpkg包管理器详解
  9. oracle 安装乱码,linux安装Oracle中文乱码问题汇总
  10. c语言的单行注释范围,c语言中的注释,multi-line comment