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实现从ftp服务器下载文件的方法
Apr 30 Python
python数据结构之图的实现方法
Jul 08 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
python实现教务管理系统
Mar 12 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
tensorflow实现加载mnist数据集
Sep 08 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
python使用knn实现特征向量分类
Dec 26 Python
python实现批量视频分帧、保存视频帧
May 31 Python
pandas如何处理缺失值
Jul 31 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
Protoss魔法科技
2020/03/14 星际争霸
PHP的栏目导航程序
2006/10/09 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
使用python Django做网页
2013/11/04 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
python学生信息管理系统(初级版)
2018/10/17 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Django中FilePathField字段的用法
2020/05/21 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
杠杆的科学教学反思
2014/01/10 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
高中美术教学反思
2016/02/17 职场文书