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实现的守护进程(Daemon)用法实例
Jun 02 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
基于python绘制科赫雪花
Jun 22 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
python读取Excel表格文件的方法
Sep 02 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
PHP与SQL注入攻击[二]
2007/04/17 PHP
PHP令牌 Token改进版
2008/07/18 PHP
PHP内核探索之变量
2015/12/22 PHP
JS 统计时间
2021/03/09 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
自主招生自荐信指南
2014/02/04 职场文书
同事打架检讨书
2014/02/04 职场文书
营销团队口号
2014/06/06 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
六一儿童节活动总结
2014/08/27 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
生产车间管理制度
2015/08/04 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python