Python 模拟实现单例设计模式可以通过多种方式实现,下面我将介绍其中两种常用方式。
使用__new__方法实现单例模式
Python 通过类的构造方法 __new__ 实现单例模式,因为默认情况下,__new__ 方法将会返回一个新对象,但是如果我们重写了这个方法,则可以通过控制对象的创建行为,使其无法重复创建新的实例。
class Singleton(object):
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
obj1 = Singleton()
obj2 = Singleton()
print(id(obj1))
print(id(obj2))
上面是一个使用__new__方法实现的单例模式的示例,这里创建的两个对象 obj1 和 obj2 具有相同的引用地址,说明它们是同一个实例。
使用装饰器实现单例模式
另一种实现单例模式的方式是使用装饰器。由于 Python 语言的特性,可以将装饰器函数作用于类上,从而实现对其构造方法的拦截和处理。
def singleton(cls, *args, **kw):
instances = {}
def get_instance():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return get_instance
@singleton
class MyClass:
def __init__(self, name):
self.name = name
a = MyClass("Test1")
b = MyClass("Test2")
print(a.name)
print(b.name)
print(id(a))
print(id(b))
上面是使用装饰器实现单例模式的代码示例。通过 @singleton 修饰符,将 MyClass 类处理为单例模式。在此基础上,我们创建了两个 MyClass 对象,即 a 和 b,它们具有相同的引用地址,说明它们是同一个实例。