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(Https)Post登录百度的实现代码
May 18 Python
使用python 获取进程pid号的方法
Mar 10 Python
Python计时相关操作详解【time,datetime】
May 26 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
Python for循环中的陷阱详解
Jul 13 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
python redis 批量设置过期key过程解析
Nov 26 Python
用 Python 元类的特性实现 ORM 框架
May 19 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
JavaScript中this详解
2015/09/01 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
JS原形与原型链深入详解
2020/05/09 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
python对url格式解析的方法
2015/05/13 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python3中eval函数用法使用简介
2019/08/02 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Python实现SMTP邮件发送
2020/06/16 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
酒店秘书求职信范文
2014/02/17 职场文书
总会计师岗位职责
2014/02/19 职场文书
运动会加油稿100字
2014/09/19 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript