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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python类装饰器用法实例
Jun 04 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
浅谈Python反射 & 单例模式
Mar 21 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
python 多态 协议 鸭子类型详解
Nov 27 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
基于mysql的bbs设计(四)
2006/10/09 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
令人印象深刻的自荐信
2014/05/25 职场文书
公司合并协议书范本
2014/09/30 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
倡议书作文
2015/01/19 职场文书
少年犯观后感
2015/06/11 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
同学联谊会邀请函
2019/06/24 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python