python 单体模式 的几种实现
这是本人的一篇学习笔记。
本文用 python 实现单体模式,参考了这里
一、修改父类的 __dict__
class Borg:
    _shared_state = {}
    def __init__(self):
        self.__dict__ = self._shared_state
class Singleton(Borg):
    def __init__(self, name):
        super().__init__()
        self.name = name
    def __str__(self):
        return self.name
x = Singleton('sausage')
print(x)
y = Singleton('eggs')
print(y)
z = Singleton('spam')
print(z)
print(x)
print(y)
注意,这种方法实现的并非真正的单体模式!!
下面几种方法实现的才是真正的单体模式
二、使用元类
先看看这里关于元类的描述:
元类一般用于创建类。
在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性
__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__。如果还没有发现__metaclass__属性,解释器会检查名字为__metaclass__的全局变量,如果它存在,就使用它作为元类。否则, 使用内置的type作为此类的元类。
1. 继承 type,使用 __call__
注意__call__的参数
class Singleton(type):
    _instance = None
    def __call__(self, *args, **kw):
        if self._instance is None:
            self._instance = super().__call__(*args, **kw)
        return self._instance
class MyClass(object):
    __metaclass__ = Singleton
print(MyClass())
print(MyClass())
2. 继承 type,使用 __new__
注意__new__的参数
class Singleton(type):
    _instance = None
    def __new__(cls, name, bases, dct):
        if cls._instance is None:
            cls._instance = super().__new__(cls, name, bases, dct)
        return cls._instance
class MyClass(object):
    __metaclass__ = Singleton
print(MyClass())
print(MyClass())
3. 继承 object,使用 __new__
注意__new__的参数
class Singleton(object):
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
class MyClass(object):
    __metaclass__ = Singleton
print(MyClass())
print(MyClass())
下面还有一个很巧妙的方法实现单体模式
使用类方法classmethod
class Singleton:
    _instance = None
    @classmethod
    def create(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
    def __init__(self):
        self.x = 5       # or whatever you want to do
sing = Singleton.create()
print(sing.x)  # 5
sec = Singleton.create()
print(sec.x)  # 5
												
											python 单体模式 的几种实现的更多相关文章
- javascript中单体模式的实现
		
单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对 ...
 - JS设计模式之单体模式(Singleton)
		
单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对 ...
 - Python实现Singleton模式的几种方式
		
使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对pyt ...
 - JavaScript中的单体模式四种实现方式
		
/* 1 简单单体 */ var Singleton = { attr1: 1 , method1:function(){ //do sth } }; alert(Singleton.attr1); ...
 - JavaScript设计模式——单体模式
		
一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...
 - javascript单体模式
		
单体模式的思想在于保证一个特定类仅有一个实例.这意味着当第二次使用同一个类创建的新对象的时候,应该得到与第一个所创建的对象完全相同. javacript中并没有类,因此对单体咬文嚼字的定义严格来说并没 ...
 - JS设计模式——5.单体模式
		
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
 - 读书笔记之 - javascript 设计模式 - 单体模式
		
单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...
 - js设计模式--单体模式
		
GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ...
 
随机推荐
- 【Redis】Redis学习(四) Redis Sentinel模式详解
			
主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生. Redis Sentinel是Redis官方提供的集群管理工具,主要有三大 ...
 - Windows10系统的Linux子系统中安装MySQL数据库心得
			
后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...
 - word2vec前世今生
			
word2vec前世今生 2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地 ...
 - Hibernate 批处理
			
批处理 考虑一种情况,你需要使用 Hibernate 将大量的数据上传到你的数据库中.以下是使用 Hibernate 来达到这个的代码片段: Session session = SessionFact ...
 - Angular JS (一)
			
AngularJS是一个js框架,以js编写的库.跟knockoutJS类似. AngularJS扩展了html 通过ng-directives扩展了html:ng-app定义一个angularJS应 ...
 - CreateProjectFormat——初始项目目录格式
			
百度云链接:https://pan.baidu.com/s/1f_2YaMf9619Rt5AlC6nryQ 密码:v2cb 修改中...
 - JS里设定延时
			
使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延迟一段时间,再进行某项操作. setTimeout("function",tim ...
 - ODS设计
			
1.数据调研 2.确定数据范围 需要把上端应用需求与ODS数据范围进行验证,以确保应用所需的数据都已经从业务系统中抽取出来,并且得到了很好的组织,以ER模型表示数据主题关系 3.根据数据范围进行进一步 ...
 - CentOS7 配置静态 ip
			
1. 为 CentOS7 配置静态 ip 1.1 修改文件/etc/sysconfig/network-scripts/ifcfg-ens33 sudo vi /etc/sysconfig/netwo ...
 - struts2框架
			
详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html Struts2 基于MVC设计模式的web应用程序 ...