单例模式

单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。  让所有通过该类实例化出的对象,都指向同一个内存地址。

优点:节省内存空间。

单例模式有五种表现形式:

1.通过classmethod实现

2.通过__new__实现

3.通过导入模块时实现

4.通过装饰器实现

5.通过元类实现

1.通过classmethod实现

classmethod单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准

class Sun:
__instance = None def __init__(self, ip, port):
self.ip = ip
self.port = port @classmethod
def single(cls, ip, port):
if not cls.__instance:
cls.__instance = cls(ip, port) return cls.__instance obj1 = Sun.single('192.168.1.1', 9090)
obj2 = Sun.single('127.0.0.1', 8080)
obj3 = Sun.single('255.255.255.0', 7070)
print(obj3.ip) # 192.168.1.1
print(obj2.ip) # 192.168.1.1
print(obj1.ip) # 192.168.1.1

  

2.通过__new__实现

 __new__单例开辟的空间中,最新的内容是最后一次被更新的。之前的对象统一以【最新】的为准.

class Sun:
__instance = None def __init__(self, ip, port):
self.ip = ip
self.port = port def __new__(cls, *args, **kwargs): # 此处传入的参数只和类相关,其他的。
if not cls.__instance:
cls.__instance = object.__new__(cls) return cls.__instance obj1 = Sun('192.168.1.1', 9090)
obj2 = Sun('127.0.0.1', 8080)
obj3 = Sun('255.255.255.0', 7070)
print(obj3.ip) # 255.255.255.0
print(obj2.ip) # 255.255.255.0
print(obj1.ip) # 255.255.255.0

 

3.通过元类实现单例模式

元类单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准

# _*_ coding: gbk _*_
# @Author: Wonder
class Singleton(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 继承
self._instance = None # 派生 def __call__(self, *args, **kwargs):
if not self._instance:
self._instance = super().__call__(*args, **kwargs)
return self._instance # 调用就返回 class MySQL(metaclass=Singleton):
def __init__(self, host, port):
self.host = host
self.port = port obj1 = MySQL('192.168.1.1', 9090)
obj2 = MySQL('127.0.0.1', 8080)
obj3 = MySQL('255.255.255.0', 7070)
print(obj1.host) # 192.168.1.1
print(obj2.host) # 192.168.1.1
print(obj3.host) # 192.168.1.1

  

 

CSIC_716_20191129【 单例模式 的五种实现方式】的更多相关文章

  1. iOS开发中数组常用的五种遍历方式

    随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...

  2. JAVA中单例模式的几种实现方式

    1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...

  3. Spring事务Transaction配置的五种注入方式详解

    Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...

  4. CacheConcurrencyStrategy五种缓存方式

    CacheConcurrencyStrategy有五种缓存方式:  CacheConcurrencyStrategy.NONE,不适用,默认  CacheConcurrencyStrategy.REA ...

  5. IPC五种通讯方式

    IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...

  6. LFU五种实现方式,从简单到复杂

    前言 最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊.这个月我估计都是中等和困难题,没有简单题了. 幸好,力扣上有各种大牛给写题解.看着他们行云流水的代码,真的是羡慕不已.让我印象最深刻的就是 ...

  7. Python 单例模式的几种实现方式

    单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...

  8. JS 跨域问题常见的五种解决方式

    一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来 ...

  9. Python中的单例模式的几种实现方式的优缺点及优化

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

随机推荐

  1. node升级

    1. 全局安装n: npm i -g n; 2.查看n版本: n -v 3.查看node版本: node -v 4.安装node最新稳定版本: n stable 5.安装node指定版本: n 9.1 ...

  2. JMeter 并发压力测试

    一,下载JMeter http://jmeter.apache.org/download_jmeter.cgi 二,创建默认配置 可以不用配置相同参数. 测试计划:右键添加线程组 线程组:右键添加  ...

  3. winpe

    winpe winpe winpe 工具 判断是否pe系统的方法:GetSystemDisk()

  4. redis集群扩容(添加新节点)

    一.创建节点(接上文) 1.在H1服务器/root/soft目录下创建7002目录 2.将7001目录的配置文件redis.conf拷贝到7002,并修改配置文件的端口 3.进入 redis-5.0. ...

  5. 59. jdk1.5新特性之----增强for循环

    /*jdk1.5新特性之----增强for循环:底层是一个迭代器 作用:简化迭代器书写格式 使用范围:实现了Iterable接口的对象或者数组对象 格式:    for(变量类型  变量名 :遍历目标 ...

  6. Magento笔记/记录(1)

    1.Magento eav_attribute表中source如何指定自定义数据来源  如果你引用的类名为yebihai_usermanage_model_entity_school你必须完整的给出地 ...

  7. 屏幕尺寸,分辨率,PPI,像素之间的关系

    什么是屏幕尺寸? 华为荣耀7的尺寸是5.2英寸.这个5.2英寸是手机屏幕对角线的长度. 1英寸(inch)=2.54厘米(cm) 什么是分辨率? 华为荣耀7的分辨率是1920PX*1080PX.像素是 ...

  8. 排序+并查集——cf1213F

    /* 有向边(pi,pi+1),形成链后进行dfs,求出dfs序 一个联通块内的元素必须是同一个字符,如果最后的联通块个数<k,说明不行 */ #include<bits/stdc++.h ...

  9. Sophus安装时Eigen库更新版本的问题

    原文链接:https://blog.csdn.net/m0_38055352/article/details/102900516

  10. CF 600E. Lomsat gelral(dsu on tree)

    解题思路 \(dsu\) \(on\) \(tree\)的模板题.暴力而优雅的算法,轻儿子的信息暴力清空,重儿子的信息保留,时间复杂度\(O(nlogn)\) 代码 #include<iostr ...