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

 更新时间:2021年06月15日 09:37:29   作者:云崖先生  
单例模式应该是应用最广泛,实现最简单的一种创建型模式。本文详细的介绍了Python实现单例模式的5种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

基本介绍

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

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

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

优缺点

优点:

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

缺点:

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

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进阶教程之文本文件的读取和写入

    这篇文章主要介绍了python进阶教程之文本文件的读取和写入,本文讲解的是最基本的文件读取和写入功能,需要的朋友可以参考下
    2014-08-08
  • Python学习笔记之os模块使用总结

    Python学习笔记之os模块使用总结

    这篇文章主要介绍了Python学习笔记之os模块使用总结,本文总结了多个常用方法,需要的朋友可以参考下
    2014-11-11
  • python 获取当天凌晨零点的时间戳方法

    python 获取当天凌晨零点的时间戳方法

    今天小编就为大家分享一篇python 获取当天凌晨零点的时间戳方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python实现三阶魔方还原的示例代码

    python实现三阶魔方还原的示例代码

    这篇文章主要介绍了python实现三阶魔方还原的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python生成随机数字和字符详情

    Python生成随机数字和字符详情

    这篇文章主要介绍了Python生成随机数字和字符详情,random是python自带库,使用前导入import random即可,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • python中的bool数组取反案例

    python中的bool数组取反案例

    这篇文章主要介绍了python中的bool数组取反案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python爬虫爬取煎蛋网图片代码实例

    Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 从零学python系列之新版本导入httplib模块报ImportError解决方案

    从零学python系列之新版本导入httplib模块报ImportError解决方案

    在使用新版python打开旧版本代码的时候,可能会有些报错或者不兼容的情况出现,今天我们就来分析其中的一种情况
    2014-05-05
  • python爬虫之PySpider框架的使用

    python爬虫之PySpider框架的使用

    本文主要介绍了python爬虫之PySpider框架的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 超详细注释之OpenCV构建透明的叠加层

    超详细注释之OpenCV构建透明的叠加层

    这篇文章主要介绍了OpenCV构建透明的叠加层,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论