Python单体模式的几种常见实现方法详解
时间:2019-03-30
本文章向大家介绍Python单体模式的几种常见实现方法详解,主要包括Python单体模式的几种常见实现方法详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了Python单体模式的几种常见实现方法。分享给大家供大家参考,具体如下:
这里python实现的单体模式,参考了:https://stackoverflow.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852
一、修改父类的 __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相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java基础系列之fastjson parse多级json数据
- Linux系列之下载安装jdk-8u261-linux-i586.tar.gz
- 常见网页特效案例
- MySQL系列之体系结构原理学习笔记
- 触屏事件
- 10.2【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- uni-app 与 Vue H5 项目通讯
- Gridview][UpdateCommand的写法要点]
- MySQL系列之事务日志Undo log学习笔记
- click 延时解决方案
- Splash抓取javaScript动态渲染页面
- Sentence-Transformer的使用及fine-tune教程
- MySQL系列之事务日志Redo log学习笔记
- jQuery 的基本使用
- uni-app项目改用vue-cli npm运行报错及问题总汇