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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
HTML的form表单和django的form表单
Jul 25 Python
pytorch常见的Tensor类型详解
Jan 15 Python
python中字典增加和删除使用方法
Sep 30 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
php 删除无限级目录与文件代码共享
2008/11/22 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
小学教师评语大全
2014/04/23 职场文书
自我管理的活动方案
2014/08/25 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
市场总监岗位职责
2015/02/11 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
浅析Python实现DFA算法
2021/06/26 Python