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实现ping的方法
Jul 06 Python
浅谈Python数据类型之间的转换
Jun 08 Python
定制FileField中的上传文件名称实例
Aug 23 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
Python之list对应元素求和的方法
Jun 28 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
python的reverse函数翻转结果为None的问题
May 11 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
php 常用字符串函数总结
2008/03/15 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
Vue实现简单分页器
2018/12/29 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
urllib2自定义opener详解
2014/02/07 Python
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
QML实现钟表效果
2020/06/02 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
电气自动化大学生求职信
2013/10/16 职场文书
优秀学生自我鉴定范例
2013/12/18 职场文书
海南地接欢迎词
2014/01/14 职场文书
安全宣传标语
2014/06/10 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
利用 JavaScript 构建命令行应用
2021/11/17 Javascript