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
,它接受一个类作为参数,并返回一个新的函数 wrapper
。wrapper
函数会检查被装饰的类是否已经创建了实例,如果没有,那么它会创建一个新的实例并存储在字典 instances
中;如果已经创建了实例,那么它会直接返回该实例。然后,我们使用 @singleton
装饰器来装饰 Singleton
类,使其成为一个单例类。
注意,这两种实现方式都不是线程安全的。如果需要在多线程环境中使用单例模式,那么需要使用线程锁或其他同步机制来确保单例的唯一性。