狂自私

导航

python单例模式

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。Python 中实现单例模式有多种方法,以下是几种常见的实现方式:

1. 使用模块

最简单的单例实现是利用 Python 的模块特性,因为模块在第一次导入时会被初始化,并且后续导入将返回相同的模块对象。

示例:

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

singleton_instance = Singleton()

在其他模块中导入 singleton_instance 即可:

from singleton import singleton_instance
singleton_instance.value = 42

2. 使用类变量

通过类变量来存储单例实例,确保该类只有一个实例。

示例:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

# 测试
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出: True

3. 使用装饰器

可以创建一个装饰器来实现单例模式,它可以用于任何类。

示例:

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:
    pass

# 测试
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出: True

4. 使用元类

元类可以用来控制类的创建过程,从而实现单例模式。

示例:

class SingletonMeta(type):
    _instances = {}

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

class Singleton(metaclass=SingletonMeta):
    pass

# 测试
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出: True

总结

单例模式在需要确保某个类只有一个实例时非常有用。Python 提供了多种实现单例模式的方法,包括使用模块、类变量、装饰器和元类。选择哪种实现方式取决于具体的需求和个人喜好。

posted on 2024-09-12 09:08  狂自私  阅读(21)  评论(0编辑  收藏  举报