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 socket 超时设置 errno 10054
Jul 01 Python
利用Python中的输入和输出功能进行读取和写入的教程
Apr 14 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
python解析基于xml格式的日志文件
Feb 25 Python
python实现PCA降维的示例详解
Feb 24 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
python绘制分布折线图的示例
Sep 24 Python
Python3接口性能测试实例代码
Jun 20 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
php查询ip所在地的方法
2014/12/05 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
PHP加密解密函数详解
2015/10/28 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
javascript动态创建链接的方法
2015/05/13 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python入门篇之条件、循环
2014/10/17 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
美国钻石商店:Zales
2016/11/20 全球购物
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
小学假期安全广播稿
2014/09/28 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
幽默导游词开场白
2015/05/29 职场文书
父亲节感言
2015/08/03 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP
Redis三种集群模式详解
2021/10/05 Redis
 python中的元类metaclass详情
2022/05/30 Python