Python - 单例类
在 Python 中,Singleton class 是单例设计模式的实现,这意味着这种类只能有一个对象。这有助于在执行一些耗费资源的操作时优化内存使用,例如创建数据库连接。
如果我们尝试为单例类创建多个对象,只有第一次会创建对象。此后,将返回相同的对象实例。
在 Python 中创建单例类
我们可以使用以下方式在 Python 中创建和实现单例类 —
- 使用 __init__
- 使用 __new__
使用 __init__
__init__ 方法 是一个实例方法,用于初始化新创建的对象。当从类创建对象时,它会被自动调用。
如果我们将此方法与静态方法结合,并提供必要的检查,即类是否已存在实例,我们就可以在创建第一个对象后限制创建新对象。
示例
在下面的示例中,我们使用 __init__ 方法创建一个单例类。
class Singleton:
__uniqueInstance = None
@staticmethod
def createInstance():
if Singleton.__uniqueInstance == None:
Singleton()
return Singleton.__uniqueInstance
def __init__(self):
if Singleton.__uniqueInstance != None:
raise Exception("对象已存在!")
else:
Singleton.__uniqueInstance = self
obj1 = Singleton.createInstance()
print(obj1)
obj2 = Singleton.createInstance()
print(obj2)
运行上述代码,将显示以下结果 —
<__main__.Singleton object at 0x7e4da068a910> <__main__.Singleton object at 0x7e4da068a910>
使用 __new__
__new__ 方法 是 Python 中的一个特殊静态方法,用于创建类的全新实例。它以类本身作为第一个参数,并返回该类的新实例。
当声明 Python 类的实例时,它会内部调用 __new__() 方法。如果要实现 Singleton class,可以重写此方法。
在重写的方法中,首先检查类是否已存在实例。如果不存在(即实例为 None),则调用 super() 方法创建新对象。最后,将此实例保存在类属性中并返回结果。
示例
在以下示例中,我们使用 __new__ 方法创建一个单例类。
class SingletonClass:
_instance = None
def __new__(cls):
if cls._instance is None:
print('正在创建对象')
cls._instance = super(SingletonClass, cls).__new__(cls)
return cls._instance
obj1 = SingletonClass()
print(obj1)
obj2 = SingletonClass()
print(obj2)
上述代码给出以下结果 —
Creating the object <__main__.SingletonClass object at 0x000002A5293A6B50> <__main__.SingletonClass object at 0x000002A5293A6B50>