单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例:如果实例不存在,会创建一个实例;如果已存在就会返回这个实例。因为单例是一个类,所以你也可以为其提供相应的操作方法,以便于对这个实例进行管理。

实现单例模式的方法

1.模块导入
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
sington.py

class Sington(object):passs = Sington()

直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象
from sington import s

2.使用装饰器,装饰器参考

函数装饰器:

def singleton(kk):_instance = {}def inner(*args, **kwargs):if kk not in _instance:_instance[kk] = kk(*args, **kwargs)return _instance[kk]return inner@singleton
class Cls(object):def __init__(self, x):self.x = xcls1 = Cls(1)
cls2 = Cls(2)
print(id(cls1) == id(cls2))

类装饰器:

class singleton(object):def __init__(self, cls):self.cls = clsself._instance = {}def __call__(self, *args, **kwargs):if self.cls not in self._instance:self._instance[self.cls] = self.cls(*args, **kwargs)return self._instance[self.cls]@singleton
class Cls(object):def __init__(self, x):self.x = xcls1 = Cls(1)
cls2 = Cls(2)
print(id(cls1) == id(cls2))

3.使用类

import time
import threadingclass Singleton(object):_instance_lock = threading.Lock()def __init__(self):time.sleep(1)@classmethoddef instance(cls, *args, **kwargs):with Singleton._instance_lock:if not hasattr(Singleton, "_instance"):Singleton._instance = Singleton(*args, **kwargs)return Singleton._instancedef task():obj = Singleton.instance()print(obj)for _ in range(10):t = threading.Thread(target=task)t.start()

这种方式实现的单例模式,使用时会有限制,以后实例化必须通过 obj = Singleton.instance(),如果用 obj=Singleton() ,这种方式得到的不是单例
4.使用__new__,参考:init__和__new
当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式

import threading
class Singleton(object):_instance_lock = threading.Lock()def __init__(self):passdef __new__(cls, *args, **kwargs):if not hasattr(Singleton, "_instance"):with Singleton._instance_lock:if not hasattr(Singleton, "_instance"):Singleton._instance = object.__new__(cls)  return Singleton._instanceobj1 = Singleton()
obj2 = Singleton()
print(obj1,obj2)def task(arg):obj = Singleton()print(obj)for i in range(10):t = threading.Thread(target=task,args=[i,])t.start()

5.基于元类实现

1.类由type创建,创建类时,type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 call 方法

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):passobj = Foo()
# 执行type的 __call__ 方法,调用 Foo类(是type的对象)的 __new__方法,用于创建对象,然后调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。obj()  # 执行Foo的 __call__ 方法

元类使用:

class SingletonType(type):def __init__(self, *args, **kwargs):super(SingletonType, self).__init__(*args, **kwargs)def __call__(cls, *args, **kwargs):  # 这里的cls,即Foo类print('cls', cls)obj = cls.__new__(cls, *args, **kwargs)cls.__init__(obj, *args, **kwargs)  # Foo.__init__(obj)return objclass Foo(metaclass=SingletonType):  # 指定创建Foo的type为SingletonTypedef __init__(self, name):self.name = namedef __new__(cls, *args, **kwargs):return object.__new__(cls)

实现单例模式:


import threadingclass SingletonType(type):_instance_lock = threading.Lock()def __call__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):with SingletonType._instance_lock:if not hasattr(cls, "_instance"):cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)return cls._instanceclass Foo(metaclass=SingletonType):def __init__(self, name):self.name = nameobj1 = Foo('name')
obj2 = Foo('name')
print(obj1, obj2)

python 单例模式浅析相关推荐

  1. python3单例-python3如何运行文件夹python单例模式

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

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

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

  3. python单例模式的4种实现方法_Python单例模式的4种实现

    模块在一个Python应用程序中只有一份,它本身就是单例的,将所需要的属性和方法,直接暴露在模块中的全局变量和方法,也可以实现单例. Python单例模式的4种实现 # !/usr/bin/env p ...

  4. Python OpenCV浅析3种滤镜效果

    Python OpenCV浅析3种滤镜效果 前言 浮雕滤镜效果 雕刻滤镜效果 凸透镜滤镜效果

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

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

  6. python单例模式基于__new__方法实现的单例模式(推荐使用,方便)

    单例模式以及Python实现 单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. 比如,某个服务器的配置信息存在在一个文件中,客户端通过Ap ...

  7. Python 单例模式

    #单例模式 class Dog(object):#定义一个类变量#None相当于c++中的NULL,修饰基本类型和类类型均可instance = None#重写__new__方法def __new__ ...

  8. Python单例模式中几种实现及优化方法

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

  9. python 单例模式的四种创建方式

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

最新文章

  1. 《Java虚拟机规范》阅读(三):Class文件格式
  2. php libev pthreads,libuv 与 libev 的对比
  3. Linux下安装Tomcat7
  4. MongoDB 之 幽灵操作避免
  5. php导出excel时间错误(同一个时间戳,用date得到不同的时间)
  6. react 引入 mobx @babel/core: 7.2.2
  7. 摄像头图像分析目标物体大小位置_单个运动摄像头估计运动物体深度,谷歌挑战新难题...
  8. FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL
  9. 华为和荣耀蓝牙耳机为什么那么贵?
  10. vue 动态显示实时时间
  11. 3、思科模拟器介绍 (认识思科模拟器界面、安装思科模拟器、思科模拟器汉化)
  12. 澳洲国立大学的计算机专业,澳洲国立大学计算机专业前景和申请详解
  13. 对话 DenseNet 一作黄高:做有韧劲、能抗压、不断探索未知的科研
  14. 京东云php环境配置,干货 | 京东云应用负载均衡(ALB)多功能实操
  15. 百度智能云怎样建立服务器,百度智能云服务器BCC系统盘扩容如何做
  16. 卧龙图甄选 | 惊蛰来到,万物复苏,春天的气息扑面而来
  17. 好名字——能看出方法特征的名字才是好名字
  18. webpack出现CssSyntaxError
  19. STM32学习笔记之一:时钟源HSI、HSE、LSI、LSE、PLL及其不接外部晶体时的管脚配置
  20. Oracle中创建,删除同义词 Synonym

热门文章

  1. html头像转动,基于jquery实现人物头像跟随鼠标转动
  2. 如何用pylint提高代码质量
  3. 中年程序员被裁了,他哭了!
  4. 面试题:什么是事务,怎么理解事务?
  5. CIFAR10分类算法记录
  6. 398. 随机数索引(哈希表预处理 Or 蓄水池抽样)
  7. 学python的100个单词_200个Python学习单词请收藏
  8. 负载均衡(SLB与ELB)
  9. RRDTool 详解
  10. Linux学习笔记1--Linux文件系统之CentOS7挂载U盘