iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python的单例模式
  • 308
分享到

python的单例模式

模式python 2023-01-31 05:01:15 308人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python单例模式 所谓单例,就是保证一个类仅有一个实例。所有引用(实例、对象)拥有相同的状态(属性)和行为(方法); 同一个类的所有实例天然拥有相同的行为(方法); 只需要保证同一个类的所有实例具有相同的状态(属性)即可; 所有实例共享

python单例模式
所谓单例,就是保证一个类仅有一个实例。所有引用(实例、对象)拥有相同的状态(属性)和行为(方法);
同一个类的所有实例天然拥有相同的行为(方法);
只需要保证同一个类的所有实例具有相同的状态(属性)即可;
所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
 
单例模式动机
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在打印的任务;一个系统中只能有一个串口管理器或文件系统;一个系统只能有一个计时工具或ID生成器。如在window是中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪个才是真实的状态。因为有时确保系统中某个对象的唯一性(即一个类只有一个实例)非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能阻止我们实例化多个对象。一个更好的方法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
单例模式要点
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是一下三点:
一是单例模式的类只提供私有的构造函数;
二是类定义中含有一个该类的静态私有对象;
三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

实现单例模式方法1:

  1. #/usr/bin/Python 
  2. #-*- encoding=utf-8 -*-    
  3.  
  4. #方法1,实现__new__方法    
  5. #并在将一个类的实例绑定到类变量_instance上,    
  6. #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回    
  7. #如果cls._instance不为None,直接返回cls._instance    
  8. class Singleton(object):   
  9.     def __new__(cls, *args, **kw):   
  10.         if not hasattr(cls, '_instance'):   
  11.             orig = super(Singleton, cls)   
  12.             cls._instance = orig.__new__(cls, *args, **kw)   
  13.         return cls._instance   
  14.    
  15. class MyClass(Singleton):   
  16.     a = 1   
  17.    
  18. one = MyClass()   
  19. two = MyClass()   
  20.    
  21. two.a = 3   
  22. print one.a   
  23. #3    
  24. #one和two完全相同,可以用id(), ==, is检测    
  25. print id(one)   
  26. #29097904    
  27. print id(two)   
  28. #29097904    
  29. print one == two   
  30. #True    
  31. print one is two   
  32. #True    

实现单例模式方法2:

  1. #方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)    
  2. #同一个类的所有实例天然拥有相同的行为(方法),    
  3. #只需要保证同一个类的所有实例具有相同的状态(属性)即可    
  4. #所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)    
  5. #可参看:Http://code.activestate.com/recipes/66531/    
  6. class Borg(object):   
  7.     _state = {}   
  8.     def __new__(cls, *args, **kw):   
  9.         ob = super(Borg, cls).__new__(cls, *args, **kw)   
  10.         ob.__dict__ = cls._state   
  11.         return ob   
  12.    
  13. class MyClass2(Borg):   
  14.     a = 1   
  15.    
  16. one = MyClass2()   
  17. two = MyClass2()   
  18.    
  19. #one和two是两个不同的对象,id, ==, is对比结果可看出    
  20. two.a = 3   
  21. print one.a   
  22. #3    
  23. print id(one)   
  24. #28873680    
  25. print id(two)   
  26. #28873712    
  27. print one == two   
  28. #False    
  29. print one is two   
  30. #False    
  31. #但是one和two具有相同的(同一个__dict__属性),见:    
  32. print id(one.__dict__)   
  33. #30104000    
  34. print id(two.__dict__)   
  35. #30104000    

实现单例模式方法3:

  1. #方法3:本质上是方法1的升级(或者说高级)版    
  2. #使用__metaclass__(元类)的高级python用法    
  3. class Singleton2(type):   
  4.     def __init__(cls, name, bases, dict):   
  5.         super(Singleton2, cls).__init__(name, bases, dict)   
  6.         cls._instance = None   
  7.     def __call__(cls, *args, **kw):   
  8.         if cls._instance is None:   
  9.             cls._instance = super(Singleton2, cls).__call__(*args, **kw)   
  10.         return cls._instance   
  11.    
  12. class MyClass3(object):   
  13.     __metaclass__ = Singleton2   
  14.    
  15. one = MyClass3()   
  16. two = MyClass3()   
  17.    
  18. two.a = 3   
  19. print one.a   
  20. #3    
  21. print id(one)   
  22. #31495472    
  23. print id(two)   
  24. #31495472    
  25. print one == two   
  26. #True    
  27. print one is two   
  28. #True    

实现单例模式方法4:

  1. #方法4:也是方法1的升级(高级)版本,    
  2. #使用装饰器(decorator),    
  3. #这是一种更pythonic,更elegant的方法,    
  4. #单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的    
  5. def singleton(cls, *args, **kw):   
  6.     instances = {}   
  7.     def _singleton():   
  8.         if cls not in instances:   
  9.             instances[cls] = cls(*args, **kw)   
  10.         return instances[cls]   
  11.     return _singleton   
  12.   
  13. @singleton   
  14. class MyClass4(object):   
  15.     a = 1   
  16.     def __init__(self, x=0):   
  17.         self.x = x   
  18.    
  19. one = MyClass4()   
  20. two = MyClass4()   
  21.    
  22. two.a = 3   
  23. print one.a   
  24. #3    
  25. print id(one)   
  26. #29660784    
  27. print id(two)   
  28. #29660784    
  29. print one == two   
  30. #True    
  31. print one is two   
  32. #True    
  33. one.x = 1   
  34. print one.x   
  35. #1    
  36. print two.x   
  37. #1   

 

--结束END--

本文标题: python的单例模式

本文链接: https://www.lsjlt.com/news/188596.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python的单例模式
    python单例模式 所谓单例,就是保证一个类仅有一个实例。所有引用(实例、对象)拥有相同的状态(属性)和行为(方法); 同一个类的所有实例天然拥有相同的行为(方法); 只需要保证同一个类的所有实例具有相同的状态(属性)即可; 所有实例共享...
    99+
    2023-01-31
    模式 python
  • python单例模式
    正在写python单例模式的一些东西,查到资料,记录一下。原文地址:http://hi.baidu.com/tianfeng1015/blog/item/f0373dd0fbb8bbcb50da4bca.html 我们可以使用 __new_...
    99+
    2023-01-31
    模式 python
  • python 单例模式
    单例模式 多次实例化的结果指向同一个实例   单例模式实现方式 方式一: 1 import settings 2 3 class MySQL: 4 __instance = None 5 6 def __...
    99+
    2023-01-30
    模式 python
  • Python中的单例模式
    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在...
    99+
    2023-01-31
    模式 Python
  • 【python 设计模式】单例模式
    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中...
    99+
    2023-01-31
    模式 python
  • Python设计模式——单例模式
    一、单例模式理论单例模式:    保证某一个类只有一个实例,而且在全局只有一个访问点优点:    1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间    2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用...
    99+
    2023-01-31
    模式 Python
  • python设计模式之单例模式
    单例模式是一种创建型设计模式,它确保一个类有且只有一个特定类型的对象,并提供全局访问点。其意图为: 确保类有且只有一个对象被创建 为对象提供一个访问点,使程序可以全局访问该对象 控制共享资源的并行访问 简单理解:单例...
    99+
    2023-01-30
    模式 python
  • python单例模式之seleniumdriver实现单例
    目录一、使用装饰器实现单例二、web自动化driver实现单例模式2.1 编写单例模式的装饰器2.2 driver 使用装饰器,实现单例模式2.3 获取driver的实例,就是单例了...
    99+
    2022-11-13
  • python logging 单例模式范
    #logger.py #author: Zilu.Tang #date: 20160107 import logging import os class SingleLogger(object):     __instance = No...
    99+
    2023-01-31
    模式 python logging
  • Python实现单例模式
    1.什么是单例? 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。那么单例模式有什么用途呢?举个常见的单例模式例子,我们平时使用的电脑上都有一个回收站,在整个操作系统中,回...
    99+
    2023-01-31
    模式 Python
  • Python单例模式实例详解
    本文实例讲述了Python单例模式。分享给大家供大家参考,具体如下: 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。 实现某个类只有一个实例的途径: 1,让一个全局变量使得一个对象被访问,...
    99+
    2022-06-04
    详解 实例 模式
  • Python 设计模式创建型单例模式
    目录一、单例模式二、应用场景三、编码示例1.单线程中的单例模式方式一、重载类构造器方式二、实现单例装饰器2.多线程中的单例模式方式三、重载具有线程锁的类构造器一、单例模式 单例模式,...
    99+
    2022-11-13
  • 5种Python单例模式的实现方式
    本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次。 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new__方...
    99+
    2022-06-04
    模式 方式 Python
  • Python学习笔记:单例模式
    单例模式:一个类无论实例化多少次,返回的都是同一个实例,例如:a1=A(), a2=A(), a3=A(),a1、a2和a3其实都是同一个对象,即print(a1 is a2)和print(a2 is a3)都会打印True。 实现方式:...
    99+
    2023-01-30
    学习笔记 模式 Python
  • 详解python单例模式与metaclass
    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if ...
    99+
    2022-06-04
    详解 模式 python
  • Python学习 :反射 & 单例模式
     反射   什么是反射?   - 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)   面向对象中的反射   - 通过字符串的形式来操作(获取、检查、增加、删除)对象中的成员   - python中的一切事物都是对象...
    99+
    2023-01-31
    反射 模式 Python
  • Python中单例模式的实现方法
    单例 — 让 类 创建的对象,在系统中 只有唯一的一个实例; 1)、定义一个类属性,初始值是 None ,用于记录 单例对象的引用;2)、重写 new 方法;3)、如果 ...
    99+
    2022-11-11
  • Python实现单例模式的方式有哪些
    这篇“Python实现单例模式的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python实现单例模式的方式有哪些...
    99+
    2023-06-30
  • Python实现单例模式的方式是什么
    本篇内容介绍了“Python实现单例模式的方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!单例模式(Singleton Patter...
    99+
    2023-07-04
  • php 单例模式
    1,单例模式,属于创建设计模式,简单来说就是一个类只能有一个实例化对象,并提供一个当前类的全局唯一可访问入口; 2,例子 ...
    99+
    2023-08-31
    php 单例模式 创建设计模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作