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内置数据类型详解
Aug 18 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
pygame实现弹力球及其变速效果
Jul 03 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
PyQt5每天必学之单行文本框
Apr 19 Python
详解Django的CSRF认证实现
Oct 09 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
python默认参数调用方法解析
Feb 09 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
一个php作的文本留言本的例子(六)
2006/10/09 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python I/O与进程的详细讲解
2019/03/08 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
佳能法国商店:Canon法国
2019/02/14 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
演讲稿开场白
2014/01/13 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
党员活动日总结
2014/05/05 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
学校端午节活动总结
2015/02/11 职场文书
英语辞职信范文
2015/02/28 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android