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原始套接字编程示例分享
Feb 21 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
200行python代码实现2048游戏
Jul 17 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
python matplotlib实现将图例放在图外
Apr 17 Python
Python入门之基础语法详解
May 11 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
详解PHP对象的串行化与反串行化
2016/01/24 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
Express.JS使用详解
2014/07/17 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
高中毕业自我鉴定
2013/12/13 职场文书
毕业生自荐书
2014/02/02 职场文书
管理失职检讨书
2014/02/12 职场文书
2014年教师节寄语
2014/04/03 职场文书
公司新年寄语
2014/04/04 职场文书
依法行政工作汇报
2014/10/28 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
开学随笔
2015/08/15 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL