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中super的用法实例
May 28 Python
python2与python3共存问题的解决方法
Sep 18 Python
Python重新加载模块的实现方法
Oct 16 Python
python 接收处理外带的参数方法
Dec 03 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Python之多进程与多线程的使用
Feb 23 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
杏林同学录(一)
2006/10/09 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
php微信开发自定义菜单
2016/08/27 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
python socket 聊天室实例代码详解
2019/11/14 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
2014两会优秀的心得体会范文
2014/03/17 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
党的作风建设心得体会
2014/10/22 职场文书
行政经理岗位职责
2015/04/15 职场文书
推广普通话的宣传语
2015/07/13 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python