python实现单例模式方法_Python实现单例模式的5种方式
写在前面
学究嘛,就记录一下;
本质都是通过设置一个标志位来实现, 通俗的讲就是当第一次实例化时, 记录下"已经实例化了", 当再次实例化时, 将"记录"的地址返回;
题外话, 函数它不香么? 还面向对象, 要什么对象.
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种方式相关推荐
- python 财务分析可视化方法_Python数据可视化的四种简易方法
Python数据可视化的四种简易方法 作者:PHPYuan 时间:2018-11-28 03:40:43 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视 ...
- python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行
一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...
- python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...
- python读取多张图片_python读取图片的几种方式及图像宽和高的存储顺序
python读取图片的几种方式及图像宽和高的存储顺序 1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8 import cv2 import ...
- python创建学生字典_Python创建字典的八种方式
1.创建空字典 >>> dic = {} >>> type(dic) 2.直接赋值创建 >>> dic = {'spam':1, 'egg':2, ...
- python定时执行脚本_Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...
- python中连接符_python字符串连接的几种方式总结
本篇文章给大家分享的内容是关于python字符串连接的几种方式总结,有需要的朋友参考一下 python中有很多字符串连接方式,今天在写代码,顺便总结一下,从最原始的字符串连接方式到字符串列表连接,大家 ...
- python安装模块方法_Python安装模块的几种方法
一.方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行: python setup.py ...
- python调用http方法_python 使用poster模块进行http方式的文件传输到服务器的方法
这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件 ...
最新文章
- POJ - 3417 Network(树上差分)
- matlab 计算N天前(后)的日期
- android volume挂载流程,Android SDCard UnMounted 流程分析(一)
- Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)
- 基于matlab的捕食算法,运行捕食者算法(OpenTLD-master)
- 雷军这么努力,为什么还是干不过 OV?
- centos怎么装python_centos下安装python的过程
- java在底层捕获异常_Java正确捕获异常的真实类
- 10 Seconds Count Down
- 测试电脑硬盘损坏的软件,硬盘检测工具哪个好 如何检测硬盘是否损坏【详细介绍】...
- python中find函数的使用方法_详解Python中find()方法的使用
- c语言 实现推箱子小游戏
- java程序设计之炮打飞机
- QCustomplot之安装篇(一)
- 慕课-初识 学习ts笔记
- 利用百度API实现语音合成
- 接收服务器返回的文件流并下载
- Cortex-A72核心板 | RK3399六核
- 橙子引擎携多款精品TV游戏诚意呈献 2014智能电视游戏品牌峰会
- 每天记录几个面试小问题