跳到主要内容

Python 如何实现单例模式?请写出两种实现方式?

参考答案:

在 Python 中,实现单例模式主要有两种方式:使用 __new__ 方法和使用装饰器。

方法一:使用 __new__ 方法

class Singleton:
    _instance = None

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

# 使用
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出:True

在这个例子中,Singleton 类有一个类变量 _instance,用于存储单例实例。__new__ 方法在创建新实例时被调用。如果 _instance 还没有被设置(即这是第一次创建实例),那么 __new__ 方法会调用父类的 __new__ 方法来创建实例,并将其存储在 _instance 中。如果 _instance 已经被设置(即这不是第一次创建实例),那么 __new__ 方法会直接返回 _instance

方法二:使用装饰器

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

@singleton
class Singleton:
    pass

# 使用
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出:True

在这个例子中,我们定义了一个装饰器 singleton,它接受一个类作为参数,并返回一个新的函数 wrapperwrapper 函数会检查被装饰的类是否已经创建了实例,如果没有,那么它会创建一个新的实例并存储在字典 instances 中;如果已经创建了实例,那么它会直接返回该实例。然后,我们使用 @singleton 装饰器来装饰 Singleton 类,使其成为一个单例类。

注意,这两种实现方式都不是线程安全的。如果需要在多线程环境中使用单例模式,那么需要使用线程锁或其他同步机制来确保单例的唯一性。