"""
单例模式 单利模式是一种设计模式, 应用该模式的类只会生成一个实例, 可以保证在程序的不同位置
都可以且仅可以取到同一个对象实例. 如果实例不存在, 会创建一个实例, 但是如果已经存在就会返回这个实例. 四种实现方法:
1.函数装饰器实现单例模式
2.类装饰器实现单例模式
3.__new__实现单例模式
4.metaclass实现单利模式
""" # 1.函数装饰器实现单例模式 def singleton(cls):
_instance = {} def get_instance():
# 实例不存在创建实例
if cls not in _instance:
_instance[cls] = cls() # 实例存在直接返回
return _instance[cls] return get_instance @singleton
class Cls(object):
def __init__(self):
pass cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2)) # True # 2.类装饰器实现单例模式 class Singleton(object):
def __init__(self, cls):
self.cls = cls
self._instance = {} def __call__(self):
if self.cls not in self._instance:
self._instance[self.cls] = self.cls() return self._instance[self.cls] @Singleton
class Cls2(object):
def __init__(self):
pass cls3 = Cls2()
cls4 = Cls2()
print(id(cls3) == id(cls4)) # True # 3.__new__实现单例模式, 在创建实例的时候进行干预 class Singleton2(object):
_instance = None def __new__(cls, *args, **kwargs): # 实例不存在创建实例
if cls._instance is None:
cls._instance = super().__new__(cls, *args, **kwargs) # 实例存在直接返回
return cls._instance def __init__(self):
pass single1 = Singleton2()
single2 = Singleton2()
print(single1 == single2) # True # 4.metaclass实现单利模式, 元类metaclass可以通过方法__metaclass__创造类 class Singleton3(type):
_instance = {} def __call__(cls, *args, **kwargs): if cls not in cls._instance:
cls._instance[cls] = super().__call__(*args, **kwargs) return cls._instance[cls] class Cls3(metaclass=Singleton3):
pass cls5 = Cls3()
cls6 = Cls3()
print(id(cls5) == id(cls6)) # True

python---实现单例模式的更多相关文章

  1. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  2. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  3. python 以单例模式封装logging相关api实现日志打印类

    python 以单例模式封装logging相关api实现日志打印类   by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   实现功能: 支持自由配置,如下lo ...

  4. python的单例模式:

    python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...

  5. 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...

  6. 浅谈Python设计模式 - 单例模式

    本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...

  7. 【python】Python的单例模式

    原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...

  8. python实现单例模式

    有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存. 那我们就可以想,我们拿到一次数 ...

  9. Python 实现单例模式的一些思考

    一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...

  10. python之单例模式、栈、队列和有序字典

    一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...

随机推荐

  1. React学习小结(一)

    一.React的发展 facebook在构建instagram网站的时候遇见两个问题: 1.数据绑定的时候,大量操作真实dom,性能成本太高 2.网站的数据流向太混乱,不好控制 于是facebook起 ...

  2. java 中判断输入是否合法 if (变量名.hasNextInt())

    //案例: Scanner sc = new Scanner(System.in); System.out.println("你选择了新修改商品功能!"); System.out. ...

  3. LGP5341题解

    SAM一道很裸的题... 题意很明确,不再阐述. 做法很简单:找到所有出现次数为 \(k\) 的子串,然后统计. 怎么找到这些字符串呢?SAM 只能找出等价类啊. 注意 parent tree 的父亲 ...

  4. 拉普拉斯特征映射(Laplacian Eigenmaps)

    1 介绍 拉普拉斯特征映射(Laplacian Eigenmaps)是一种不太常见的降维算法,它看问题的角度和常见的降维算法不太相同,是从局部的角度去构建数据之间的关系.也许这样讲有些抽象,具体来讲, ...

  5. AQS 源码解读之加锁篇

    以 ReentrantLock 创建的非公平锁为基础,进行 AQS 全流程的分析. 分析 demo 一共有 A.B.C 三个线程. public class AQSDemo { // 带入一个银行办理 ...

  6. Gin 08 上传文件

    单文件上传 cat index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  7. python练习册 每天一个小程序 第0004题

    1 #-*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述:任一个英文的纯文本文件,统计其中的单词出现的个数. 5 参考学习链接: 6 re ht ...

  8. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

  9. loj2985「WC2019」I 君的商店(二分,思维)

    loj2985「WC2019」I 君的商店(二分,思维) loj Luogu 题解时间 真的有点猛的思维题. 首先有一个十分简单的思路: 花费 $ 2N $ 确定一个为 $ 1 $ 的数. 之后每次随 ...

  10. bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...