CSIC_716_20191129【 单例模式 的五种实现方式】
单例模式
单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。 让所有通过该类实例化出的对象,都指向同一个内存地址。
优点:节省内存空间。
单例模式有五种表现形式:
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【 单例模式 的五种实现方式】的更多相关文章
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- JAVA中单例模式的几种实现方式
1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
- CacheConcurrencyStrategy五种缓存方式
CacheConcurrencyStrategy有五种缓存方式: CacheConcurrencyStrategy.NONE,不适用,默认 CacheConcurrencyStrategy.REA ...
- IPC五种通讯方式
IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...
- LFU五种实现方式,从简单到复杂
前言 最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊.这个月我估计都是中等和困难题,没有简单题了. 幸好,力扣上有各种大牛给写题解.看着他们行云流水的代码,真的是羡慕不已.让我印象最深刻的就是 ...
- Python 单例模式的几种实现方式
单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...
- JS 跨域问题常见的五种解决方式
一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来 ...
- Python中的单例模式的几种实现方式的优缺点及优化
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
随机推荐
- Javascript基础一(介绍)
Javascript的发展历史: JavaScript在设计之初只是为了做表单验证.但是现如今,JavaScript已经成为了一门功能全面的编程语言,已经是WEB中不可缺少的一部分,如今的JavaSc ...
- ORA-01400: cannot insert NULL into
Error text: ORA-01400: cannot insert NULL into when insert into view, NULL value handler in trigger. ...
- kubernetes报错
错误信息:执行yaml文件后,服务在运行,但是提示命令找不到 原因:没有环境,相当于只有一个快捷方式 环境目录为/usr/local/bin 解决办法:将/etc/ansible/bin下的文件都拷贝 ...
- ubuntu:beyond compare 4 This license key has been revoked 解决办法
错误如图所示: 解决办法: (1)先用find命令找到bcompare所在位置:sudo find /home/ -name '*bcompare' ()进入 /home/whf/.config,删除 ...
- HBase封装easy-hbase设计实现
新增码云地址:https://gitee.com/hanmov5/mop-hbase-template 一.写在前面 业务架构用到HBase,但由于某些不可名状原因,没有用phoniex等上层工具,开 ...
- Http2协议简介
1.概述 和http1兼容.HTTP/2 没有改动 HTTP 的应用语义. HTTP 方法.状态代码.URI 和标头字段等核心概念一如往常. 不过,HTTP/2 修改了数据格式化(分帧)以及在客户端与 ...
- psecurity配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Python 项目隔离环境virtualenv--venv
virtualenv 用来为一个应用创建一套“隔离”的python运行环境. 先安装virtualenv: pip3 install virtualenv 再进入项目目录,或者创建一个项目目录并进入, ...
- sql 关系模型
我们已经知道,关系数据库是建立在关系模型上的.而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表.直线电机厂家 表的每一行称为记录(Record),记录是一个逻辑意义上的数据. ...
- Mac上安装Android SDK
今天开始学习IOS,所以先买了个设备先,但是开始使用了苹果本,还是需要继续开发Android,因为那是我现在吃饭的东西,所以就需要在Mac上配置Android SDK,原以为安装SDK很简单,和Win ...