Python的四种单例模式实现方式

 更新时间:2024年04月03日 09:46:08   作者:松柏  
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例,这篇文章主要介绍了Python的四种单例模式实现方式,需要的朋友可以参考下

★ 单例模式基本介绍

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问点,以便在需要时获取该实例。

★ 实现单例的几种方式:

  • 模块导入
  • 添加装饰器(类装饰器和函数装饰器)
  • 重写new方法
  • 元类继承

★ 方式一: 模块导入

文件结构

单例
├───file1.py
├───file2.py
├───readme
├───单例实现1_模块导入.py
└───模块导入实现单例测试.py

单例实现1_模块导入.py

"""
模块导入实现单例模式步骤:
1. 在模块中定义类
2. 实例化类并返回
3. 在其他文件中导入实例对象使用, 每个文件导入的对象实际是同一个
"""
class Singleton:
    def __init__(self, name):
        self.name = name
    def do_something(self):
        pass
singleton = Singleton('模块单例')
# 在其他py文件中
# from my_singleton import singleton

file1.py

from 单例实现1_模块导入 import singleton
print(singleton)

file2.py

from 单例实现1_模块导入 import singleton
print(singleton)

模块导入实现单例测试.py

import file1
import file2
print(file1.singleton is file2.singleton)

执行结果

<单例实现1_模块导入.Singleton object at 0x0000021B2B81F400>
<单例实现1_模块导入.Singleton object at 0x0000021B2B81F400>
True

★ 方式二: 装饰器

单例实现2_装饰器.py

# -------------------函数装饰器---------------------------
def Singleton1(cls):
    instance = {}
    def _singleton_wrapper(*args, **kargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kargs)
        return instance[cls]
    return _singleton_wrapper
# -------------------类装饰器---------------------------
class Singleton2:
    def __init__(self, cls):
        self.cls = cls
        self._instance = None
    def __call__(self, *args, **kwargs):
        if not self._instance:
            self._instance = self.cls(*args, **kwargs)
        return self._instance
# SingletonTest = Singleton1(SingletonTest) =_singleton_wrapper
# SingletonTest = Singleton2(SingletonTest) = Singleton2实例对象
@Singleton1
class SingletonTest(object):
    def __init__(self, name):
        print(">>> 初始化 <<<")
        self.name = name
s1 = SingletonTest('s1')
s2 = SingletonTest('s2')
print(s1, s2)
print(s1 is s2)
 

执行结果

>>> 初始化 <<<
<__main__.SingletonTest object at 0x000001E6A2FF73D0> <__main__.SingletonTest object at 0x000001E6A2FF73D0>
True

★ 方式三: 重写new方法

单例实现3_重写new方法.py

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            Singleton._init_flag = True
            Singleton._instance = super().__new__(cls)
        return Singleton._instance
    def __init__(self, name):
        if not hasattr(Singleton, "_init"):
            Singleton._init = True
            print(">>> 初始化 <<<")
            self.name = name
s1 = Singleton('s1')
s2 = Singleton('s2')
print(s1, s2)
print(s1 is s2)

执行结果

>>> 初始化 <<<
<__main__.Singleton object at 0x0000016663140760> <__main__.Singleton object at 0x0000016663140760>
True

★ 方式四: 元类继承

单例实现4_元类继承.py

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            # cls 是 Singleton 创建的类
            Singleton._instance = cls.__new__(cls, *args, **kwargs)
            cls.__init__(Singleton._instance, *args, **kwargs)
        return Singleton._instance
class SingletonTest(metaclass=Singleton):
    pass
class A(SingletonTest):
    def __init__(self, name):
        print(">>> 初始化 <<<")
        self.name = name
s1 = A('s1')
s2 = A('s2')
print(s1, s2)
print(s1 is s2)

执行结果

>>> 初始化 <<<
<__main__.A object at 0x000001687C79D5E0> <__main__.A object at 0x000001687C79D5E0>
True

到此这篇关于Python的四种单例模式实现方式的文章就介绍到这了,更多相关Python单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中Pyqt5使用Qlabel标签进行视频播放

    python中Pyqt5使用Qlabel标签进行视频播放

    这篇文章主要介绍了python中Pyqt5使用Qlabel实现标签进行视频播放,QLabel是界面中的标签类,继承自QFrame类,提供文本和图像的显示,是一种展示控件,下文相关内容介绍需要的小伙伴可以参考一下
    2022-04-04
  • python使用paramiko实现ssh的功能详解

    python使用paramiko实现ssh的功能详解

    这篇文章主要介绍了python使用paramiko实现ssh的功能详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python使用LSTM实现销售额预测详解

    Python使用LSTM实现销售额预测详解

    大家经常会遇到一些需要预测的场景,比如预测品牌销售额,预测产品销量。本文给大家分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释,需要的可以参考一下
    2022-07-07
  • Python 下载及安装详细步骤

    Python 下载及安装详细步骤

    这篇文章主要介绍了载及安装Python详细步骤,安装python分三个步骤,具体安装方法本文给大家介绍的非常详细,需要的朋友可以参考下
    2019-11-11
  • python request 模块详细介绍

    python request 模块详细介绍

    这篇文章主要介绍了python request 模块详细介绍,帮助大家利用request 模块学习爬虫,感兴趣的朋友可以了解下
    2020-11-11
  • Python的randrange()方法使用教程

    Python的randrange()方法使用教程

    这篇文章主要介绍了Python的randrange()方法使用教程,是Python学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • 对python pandas 画移动平均线的方法详解

    对python pandas 画移动平均线的方法详解

    今天小编就为大家分享一篇对python pandas 画移动平均线的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python浪漫表白源码

    python浪漫表白源码

    今天你表白了吗? 这篇文章主要为大家分享了python浪漫表白源码 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 基于Python实现PDF批量转化工具

    基于Python实现PDF批量转化工具

    这篇文章主要为大家详细介绍了如何基于Python制作一个PDF批量转化工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • 深入解析NumPy中的Broadcasting广播机制

    深入解析NumPy中的Broadcasting广播机制

    在吴恩达老师的深度学习专项课程中,老师有提到NumPy中的广播机制,同时那一周的测验也有涉及到广播机制的题目。那么,到底什么是NumPy中的广播机制?本文就来介绍一下
    2021-05-05

最新评论