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

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

服务器之家 - 脚本之家 - Python - Python中的单例模式,这些你都会吗?

Python中的单例模式,这些你都会吗?

2023-12-05 13:47涛哥聊Python Python

单例模式是一种有用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Python中,可以使用模块级别的变量、装饰器或元类来实现单例模式,具体取决于应用的需求。

Python中的单例模式,这些你都会吗?

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这在需要共享资源或限制某些资源的访问时非常有用。

一、理解单例模式

1、什么是单例模式?

单例模式是一种创建型设计模式,用于确保一个类只能有一个实例,并提供一种方式来访问该实例。意思是无论何时创建这个类的对象,都会返回相同的实例。

单例模式通常在以下情况下使用:

  • 当一个类的实例需要被多个部分共享访问时。
  • 当希望限制一个类的实例只能有一个,以避免资源浪费或不一致性。
  • 当一个类的实例需要延迟初始化,即只在需要时才创建。

2、单例模式的优点

  • 保证一个类只有一个实例,减少内存占用和资源浪费。
  • 提供一个全局访问点,允许在应用程序中轻松访问该实例。
  • 允许延迟初始化,只在需要时才创建实例。

3、单例模式的应用场景

  • 配置管理器:用于保存全局配置信息的单例对象。
  • 数据库连接池:确保只有一个数据库连接池实例。
  • 日志记录器:用于记录应用程序日志的单例对象。
  • 缓存:用于保存全局缓存数据的单例对象。

二、Python中的单例模式实现

Python中的单例模式可以使用不同的方法来实现。

以下是一些常见的方式:

1、使用模块级别的变量

# singleton.py

class Singleton:
    def __init__(self):
        self.value = None

    def set_value(self, value):
        self.value = value

    def get_value(self):
        return self.value

singleton_instance = Singleton()

在上述示例中,创建一个Singleton类,并在模块级别创建了一个singleton_instance变量,它是一个单例对象。无论在应用程序的任何地方导入singleton.py模块,都将共享相同的singleton_instance对象。

# main.py
from singleton import singleton_instance

singleton_instance.set_value(42)

# 在另一个地方导入并使用
from singleton import singleton_instance

print(singleton_instance.get_value())  # 输出:42

2、使用装饰器

def singleton(cls):
    instances = {}
    
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    
    return get_instance

@singleton
class Singleton:
    def __init__(self):
        self.value = None

    def set_value(self, value):
        self.value = value

    def get_value(self):
        return self.value

在上述示例中,定义一个singleton装饰器,确保每个类只有一个实例。通过将@singleton应用到类上,该类将成为一个单例类。

# main.py
from singleton import Singleton

instance1 = Singleton()
instance1.set_value(42)

# 在另一个地方创建实例
instance2 = Singleton()
print(instance2.get_value())  # 输出:42

3、使用元类

class SingletonMeta(type):
    _instances = {}
    
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class Singleton(metaclass=SingletonMeta):
    def __init__(self):
        self.value = None

    def set_value(self, value):
        self.value = value

    def get_value(self):
        return self.value

在上述示例中,定义一个名为SingletonMeta的元类,确保每个类只有一个实例。然后,使用metaclass=SingletonMeta将元类应用于Singleton类。

# main.py
from singleton import Singleton

instance1 = Singleton()
instance1.set_value(42)

# 在另一个地方创建实例
instance2 = Singleton()
print(instance2.get_value())  # 输出:42

单例模式小结

单例模式是一种有用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Python中,可以使用模块级别的变量、装饰器或元类来实现单例模式,具体取决于应用的需求。

使用单例模式时需要小心,确保不会滥用它。在某些情况下,它可能会引入全局状态,使代码难以理解和维护。但在合适的情况下,单例模式可以提供简单而有效的解决方案。

原文地址:https://www.toutiao.com/article/7292775984612065843/

延伸 · 阅读

精彩推荐
  • Pythonpython模拟鼠标拖动操作的方法

    python模拟鼠标拖动操作的方法

    这篇文章主要介绍了python模拟鼠标拖动操作的方法,实例分析了Python鼠标操作及键位操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    w_p_7692019-11-27
  • Python对python实现模板生成脚本的方法详解

    对python实现模板生成脚本的方法详解

    今天小编就为大家分享一篇对python实现模板生成脚本的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    像风一样的自由6122021-05-24
  • PythonPython实现的数据结构与算法之队列详解

    Python实现的数据结构与算法之队列详解

    这篇文章主要介绍了Python实现的数据结构与算法之队列,详细分析了队列的定义、功能与Python实现队列的相关技巧,以及具体的用法,需要的朋友可以参考下...

    RussellLuo3612020-06-10
  • Pythonpython装饰器深入学习

    python装饰器深入学习

    这篇文章主要深入学习了python装饰器的相关资料,什么是装饰器?装饰器遵循的原则等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    嵌动初心(aaron)7942021-01-28
  • PythonFlask和Django框架中自定义模型类的表名、父类相关问题分析

    Flask和Django框架中自定义模型类的表名、父类相关问题分析

    这篇文章主要介绍了Flask和Django框架中自定义模型类的表名、父类相关问题,结合实例形式对比分析了Flask框架与Django框架表名定义方式的不同之处,并简单描...

    qq_418041646972021-03-19
  • Python学会充分利用Python中的日志,提升你的编程level

    学会充分利用Python中的日志,提升你的编程level

    日志记录对于程序员来说是一个非常重要的功能。对于调试和显示运行时信息,日志记录同样有用。在本文中,我将介绍为什么以及如何在程序中使用pyt...

    Python学会9172021-04-25
  • PythonDjango的开发步骤原来是这样的

    Django的开发步骤原来是这样的

    这篇文章主要为大家详细介绍了Django的开发步骤,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带...

    now ~ try8882022-09-25
  • PythonPython 数据处理库 pandas 入门教程基本操作

    Python 数据处理库 pandas 入门教程基本操作

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库。本文是对Python 数据处理库 pandas 入门教程...

    只为那传说中美丽的草原6832021-02-02