Python实现单例模式的5种方法


Posted in Python onJune 15, 2021

基本介绍

一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。

单例模式应该是应用最广泛,实现最简单的一种创建型模式。

特点:全局唯一,允许更改

优缺点

优点:

  • 避免对资源的多重占用,如写入文件操作
  • 节省内存
  • 防止命名空间被污染

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

Python实现

方式1,元类实现:

class MetaClass(type):
    def __call__(self, *args, **kwargs):
        """
        self : class Singleton
        """
        if not hasattr(self, "ins"):
            insObject = super(__class__, self).__call__(*args, **kwargs)
            setattr(self, "ins", insObject)
        return getattr(self, "ins")


class Singleton(object, metaclass=MetaClass):
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式2,继承实现:

class ParentClass:
    def __new__(cls, *args, **kwargs) -> object:
        """
        cls : class Singeton
        """
        if not hasattr(cls, "ins"):
            insObject = super(__class__, cls).__new__(cls, *args, **kwargs)
            setattr(cls, "ins", insObject)
        return getattr(cls, "ins")


class Singleton(ParentClass):
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式3,装饰器实现:

def warpper(clsObject):
    def inner(*args, **kwargs):
        if not hasattr(clsObject, "ins"):
            insObject = clsObject(*args, **kwargs)
            setattr(clsObject, "ins", insObject)
        return getattr(clsObject, "ins")
    return inner


@warpper
class Singleton:
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式4,模块实现:

- foo.py --> ins = Singleton()
- bar.py --> from foo import ins

方式5,@classmethod实现单例模式:

class Singleton:

    @classmethod
    def getSingletonInstanceObject(cls, *args, **kwargs):
        if not hasattr(cls, "ins"):
            insObject = cls(*args, **kwargs)
            setattr(cls, "ins", insObject)
        return getattr(cls, "ins")


if __name__ == "__main__":
    ins = Singleton.getSingletonInstanceObject()
    print(id(ins))
    ins = Singleton.getSingletonInstanceObject()
    print(id(ins))

到此这篇关于Python实现单例模式的5种方法的文章就介绍到这了,更多相关Python 单例模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python 异或加密字符串的实例
Oct 14 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
jenkins配置python脚本定时任务过程图解
Oct 29 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
Python爬取网页信息的示例
Sep 24 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python迭代器的使用方法实例
2013/11/21 Python
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Python连接DB2数据库
2016/08/27 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python中import机制详解
2017/11/14 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
Python原始套接字编程实例解析
2020/01/29 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
sort命令的作用和用法
2012/11/04 面试题
策划主管的工作职责
2013/11/24 职场文书
音乐教学反思
2014/02/02 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS