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批量修改文件后缀示例代码分享
Dec 24 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
基于Python的OCR实现示例
Apr 03 Python
如何在python中执行另一个py文件
Apr 30 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
python属于哪种语言
Aug 16 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
pytorch常用数据类型所占字节数对照表一览
May 17 Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
Python实现简单的猜单词
Python自动化爬取天眼查数据的实现
浅谈Python响应式类库RxPy
Jun 14 #Python
Python Django ORM连表正反操作技巧
You might like
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
php5.5新数组函数array_column使用
2013/07/08 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
TCP/IP模型的分界线
2012/12/01 面试题
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
请介绍一下WSDL的文档结构
2013/03/17 面试题
工业设计专业个人求职信范文
2013/12/28 职场文书
物业招聘计划书
2014/01/10 职场文书
珍惜水资源建议书
2014/03/12 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
学校消防安全责任书
2014/07/23 职场文书
思想道德自我评价2015
2015/03/09 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
python实现商品进销存管理系统
2022/05/30 Python