脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python 设计模式创建型单例模式

Python 设计模式创建型单例模式

2022-09-27 11:26范桂飓 Python

这篇文章主要介绍了Python 设计模式创建型单例模式,即Singleton,单例是一种设计模式,应用该模式的类只会生成一个实例,下文详细介绍需要的小伙伴可以参考一下

一、单例模式

单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。

二、应用场景

整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:

  1. 系统的配置信息对象
  2. 日志对象
  3. 数据库操作对象
  4. 线程池对象

三、编码示例

1.单线程中的单例模式

方式一、重载类构造器

定义:

?
1
2
3
4
5
6
7
8
class Singleton(object):
 
    _instance = None
 
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance

使用:

?
1
2
3
4
5
6
7
8
9
if __name__ == '__main__':
    instance1 = Singleton()
    instance2 = Singleton()
    instance3 = Singleton()
 
    # 打印出 3 个实例对象的内存地址,判断是否相同。
    print(id(instance1))
    print(id(instance2))
    print(id(instance3))

方式二、实现单例装饰器

定义:

?
1
2
3
4
5
6
7
8
9
10
def singleton(cls):
 
    _instance = {}
 
    def _singleton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]
 
    return _singleton

使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@singleton
class Singleton(object):
    """单例实例"""
 
    def __init__(self, arg1):
        self.arg1 = arg1
 
if __name__ == '__main__':
    instance1 = Singleton("xag")
    instance2 = Singleton("xingag")
 
    print(id(instance1))
    print(id(instance2))

2.多线程中的单例模式

方式三、重载具有线程锁的类构造器

多线程中的单例模式,需要在__new__ 构造器中使用threading.Lock() 同步锁。

定义:

?
1
2
3
4
5
6
7
8
9
10
class Singleton(object):
 
    _instance = None
    _instance_lock = threading.Lock()
 
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            with cls._instance_lock:
                cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance

使用:

?
1
2
3
4
5
6
7
8
def task(arg):
    instance = Singleton()
    print(id(instance), '\n')
 
if __name__ == '__main__':
    for i in range(3):
        t = threading.Thread(target=task, args=[i, ])
        t.start()

到此这篇关于Python 设计模式创建型单例模式的文章就介绍到这了,更多相关Python 单例模式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://is-cloud.blog.csdn.net/article/details/122541891

延伸 · 阅读

精彩推荐
  • PythonPython实现单词拼写检查

    Python实现单词拼写检查

    这篇文章主要介绍了Python实现单词拼写检查,本文讲解了单词拼写检查的一些知识并给出两种实现方法,需要的朋友可以参考下 ...

    脚本之家6342020-06-13
  • Python详解Python的迭代器、生成器以及相关的itertools包

    详解Python的迭代器、生成器以及相关的itertools包

    这篇文章主要介绍了详解Python的迭代器、生成器以及相关的itertools包,Iterators、Generators是Python的高级特性,亦是Python学习当中必会的基本知识,需要的朋友可以...

    Sahand Saba4042020-05-28
  • Python在Python中使用HTMLParser解析HTML的教程

    在Python中使用HTMLParser解析HTML的教程

    这篇文章主要介绍了在Python中使用HTMLParser解析HTML的教程,尤其是在用Python制作爬虫程序的时候经常可以用到,需要的朋友可以参考下...

    廖雪峰5962020-06-16
  • Python解决python3爬虫无法显示中文的问题

    解决python3爬虫无法显示中文的问题

    下面小编就为大家分享一篇解决python3爬虫无法显示中文的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    正义狂哥11822021-01-31
  • Pythonpython组合无重复三位数的实例

    python组合无重复三位数的实例

    今天小编就为大家分享一篇python组合无重复三位数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Guo_Apple10552021-04-19
  • Python如何用Python编写一个电子考勤系统

    如何用Python编写一个电子考勤系统

    这篇文章主要介绍了用Python编写一个电子考勤系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    王小王-1238372021-09-04
  • Python详谈python中冒号与逗号的区别

    详谈python中冒号与逗号的区别

    下面小编就为大家分享一篇详谈python中冒号与逗号的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    langzi775852114492021-02-01
  • PythonPython使用sqlalchemy模块连接数据库操作示例

    Python使用sqlalchemy模块连接数据库操作示例

    这篇文章主要介绍了Python使用sqlalchemy模块连接数据库操作,结合实例形式分析了sqlalchemy模块的安装及连接、调用数据库相关操作技巧,需要的朋友可以参考下...

    xuejianbest7792021-06-06