python中的单例
使用__new__
因为一个类每一次实例化的时候,都会走它的__new__方法。所以我们可以使用__new__来控制实例的创建过程,代码如下:
class Single:
instance = None def __new__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
cls.instance = object.__new__(cls)
return cls.instance o1 = Single()
o2 = Single()
print(o1) # <__main__.Single object at 0x00000000021EDAC8>
print(o2) # <__main__.Single object at 0x00000000021EDAC8>
使用模块
其实,python的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。
# 在一个单独的文件定义一个类 并生成它的实例 这里我把它保存到mySingle.py中
class Single:
pass single = Single()
from SingleFile import single
# 后续在其它文件直接导入使用该对象 该对象便是单例的
obj = single
使用装饰器
我们知道,装饰器可以动态的修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例:
def singleton(cls):
instances = {}
def getinstance(*args,**kwargs):
if cls not in instances:
instances[cls] = cls(*args,**kwargs)
return instances[cls]
return getinstance @singleton
class MyClass:
a = 1 c1 = MyClass()
c2 = MyClass()
print(c1 == c2) # True
使用元类
元类(metaclass)可以控制类的创建过程,它主要做三件事:拦截类的创建、修改类的定义、返回修改后的类。使用元类实现单例模式的代码如下:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls] # Python2
# class MyClass(object):
# __metaclass__ = Singleton # Python3
class MyClass(metaclass=Singleton):
pass a=MyClass()
b=MyClass()
print(a==b)
print(a is b)
print(id(a),id(b))
python中的单例的更多相关文章
- Python中的单例设计
01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...
- 转--python 中写单例
原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...
- Python中的单例设计模式
1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式. 某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...
- Python中的单继承与多继承实例分析
Python中的单继承与多继承实例分析 本文实例讲述了Python中的单继承与多继承.分享给大家供大家参考,具体如下: 单继承 一.介绍 Python 同样支持类的继承,如果一种语言不支持继承,类就没 ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
- 28.怎样在Swift中实现单例?
1.回忆一下OC中的单例实现 //AFNetworkReachabilityManager中的单例,省略了其他代码 @interface AFNetworkReachabilityManager : ...
- iOS开发——多线程OC篇&多线程中的单例
多线程中的单例 #import "DemoObj.h" @implementation DemoObj static DemoObj *instance; // 在iOS中,所有对 ...
- 5.2:缓存中获取单例bean
5.2 缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...
- Swift中编写单例的正确方式
在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...
随机推荐
- mac 下 通过 brew 安装 MariaDB
其实在两年多前,我就推荐大家使用MariaDB了,其实真的很好用,性能高,也可以完全替代mysql 主要是这oracle实在是太**了,java都收费了,mysql迟早的事... 安装MariaDB之 ...
- [U3D Demo] 手机FPS射击游戏
游戏截图 使用插件 DOTween Easy Touch UGUI 游戏介绍 游戏使用C#开发,是在<Unity3D手机游戏开发>一书第3章游戏的基础上优化和修改的. 机枪镭射光线和枪口特 ...
- amqp笔记
1.exchange message的生产者可以将消息发送给exchange,然后由exchange路由到不同的queue中. exchange有4种类型: direct exchange:msg只会 ...
- 【原创 Hadoop&Spark 动手实践 4】Hadoop2.7.3 YARN原理与动手实践
简介 Apache Hadoop 2.0 包含 YARN,它将资源管理和处理组件分开.基于 YARN 的架构不受 MapReduce 约束.本文将介绍 YARN,以及它相对于 Hadoop 中以前的分 ...
- Elasticsearch 性能监控基础【转】
https://blog.csdn.net/yangwenbo214/article/details/74000458
- [MySQL Status] Queries,Questions,read/s区别,Com_Commit和handle_commit
Queries: 这个状态变量表示,mysql系统接收的查询的次数,包括存储过程内部的查询 Questions: 这个状态变量表示,mysql系统接收查询的次数,但是不包括存储过程内部的查询 ...
- php 慢配置文件
[root@localhost etc]# cat php-fpm.conf[global]pid = /usr/local/php/var/run/php-fpm.piderror_log = /u ...
- Github + Hexo 搭建个人博客
参考博客: 我是如何利用Github Pages搭建起我的博客,细数一路的坑 使用Hexo+Github一步步搭建属于自己的博客(基础) Hexo 准备工作: 本机已安装好 git, npm 和 no ...
- c++ 异常 discards qualifiers 丢弃
src/feedbackservice.cpp:76: error: passing `const ps::spider::urlreceiver::entry::ConfigManager' as ...
- windows 10系统 上安装scrapy
1.python的安装(我已安装完) 2.pip的安装(我已安装) 3.安装twisted https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 命令 ...