写在前面

学究嘛,就记录一下;

本质都是通过设置一个标志位来实现, 通俗的讲就是当第一次实例化时, 记录下"已经实例化了", 当再次实例化时, 将"记录"的地址返回;

题外话, 函数它不香么? 还面向对象, 要什么对象.

1. 模块(module)

这种方式不用干啥, 正常写code就可以了, 一旦这个模块被导入就会生成.pyc文件, 第二次导入时加载的就是.pyc

# girl.py

class GirlFriend:

pass

Lucy = GirlFriend()

# me.py

from girl import Lucy

2. 装饰器实现

定义一个装饰器如下

def singleton(cls):

instances = {}

@functools.wraps(cls)

def _wrapper(*args, **kw):

if cls not in instances:

print('没有该实例,创建一个')

instances[cls] = cls(*args, **kw)

return instances[cls]

return _wrapper

使用装饰器

@singleton

class GirlFriend:

pass

3. 类装饰器使其

class Singleton:

def __init__(self, cls):

self._cls = cls

self._instance = {}

def __call__(self, *args):

if self._cls not in self._instance:

self._instance[self._cls] = self._cls(*args)

return self._instance[self._cls]

# 用法

@Singleton

class GirlFriend:

pass

4. __new__方法实现

class GirlFriend:

def __new__(cls, *args, **kw):

if not hasattr(cls, '_instance'):

cls._instance = super().__new__(cls)

return cls._instance

# 用法

Lucy = GirlFriend()

5. 元类实现

class GirlFriend(type):

def __new__(cls, name, bases, attrs):

cls._instance = None

return type.__new__(cls, name, bases, attrs)

def __call__(cls, *args, **kw):

if cls._instance is None:

cls._instance = type.__call__(cls, *args, **kw)

return cls._instance

# 用法

class Lucy(metaclass=GirlFriend):

pass

总结

装饰器实现比较简单, 也好理解

python实现单例模式方法_Python实现单例模式的5种方式相关推荐

  1. python 财务分析可视化方法_Python数据可视化的四种简易方法

    Python数据可视化的四种简易方法 作者:PHPYuan 时间:2018-11-28 03:40:43 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视 ...

  2. python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  3. python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...

  4. python读取多张图片_python读取图片的几种方式及图像宽和高的存储顺序

    python读取图片的几种方式及图像宽和高的存储顺序 1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8 import cv2 import ...

  5. python创建学生字典_Python创建字典的八种方式

    1.创建空字典 >>> dic = {} >>> type(dic) 2.直接赋值创建 >>> dic = {'spam':1, 'egg':2, ...

  6. python定时执行脚本_Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...

  7. python中连接符_python字符串连接的几种方式总结

    本篇文章给大家分享的内容是关于python字符串连接的几种方式总结,有需要的朋友参考一下 python中有很多字符串连接方式,今天在写代码,顺便总结一下,从最原始的字符串连接方式到字符串列表连接,大家 ...

  8. python安装模块方法_Python安装模块的几种方法

    一.方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行: python setup.py ...

  9. python调用http方法_python 使用poster模块进行http方式的文件传输到服务器的方法

    这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件 ...

最新文章

  1. POJ - 3417 Network(树上差分)
  2. matlab 计算N天前(后)的日期
  3. android volume挂载流程,Android SDCard UnMounted 流程分析(一)
  4. Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)
  5. 基于matlab的捕食算法,运行捕食者算法(OpenTLD-master)
  6. 雷军这么努力,为什么还是干不过 OV?
  7. centos怎么装python_centos下安装python的过程
  8. java在底层捕获异常_Java正确捕获异常的真实类
  9. 10 Seconds Count Down
  10. 测试电脑硬盘损坏的软件,硬盘检测工具哪个好 如何检测硬盘是否损坏【详细介绍】...
  11. python中find函数的使用方法_详解Python中find()方法的使用
  12. c语言 实现推箱子小游戏
  13. java程序设计之炮打飞机
  14. QCustomplot之安装篇(一)
  15. 慕课-初识 学习ts笔记
  16. 利用百度API实现语音合成
  17. 接收服务器返回的文件流并下载
  18. Cortex-A72核心板 | RK3399六核
  19. 橙子引擎携多款精品TV游戏诚意呈献 2014智能电视游戏品牌峰会
  20. 每天记录几个面试小问题

热门文章

  1. 【CSS3】将截断的文字可选的显示出来
  2. 筹款の不定方程(洛谷P4956题题解,Java语言描述)
  3. 【数据结构与算法】链表倒序输出算法
  4. 【数据结构与算法】单链表的Java实现
  5. 【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃...
  6. 【静态页面架构】CSS之颜色与单位
  7. 33.JAVA编程思想——JAVA IO File类
  8. Spark MLlib
  9. jBPM开发入门指南(4)
  10. 六、JAVA基础--泛型