Python - 单例类



在 Python 中,单例类是单例设计模式的实现,这意味着这种类型的类只能有一个对象。这有助于在执行一些繁重的操作(如创建数据库连接)时优化内存使用。

如果我们尝试为单例类创建多个对象,则只会第一次创建该对象。之后,将返回相同的对象实例。

在 Python 中创建单例类

我们可以通过以下方式在 Python 中创建和实现单例类 -

  • 使用 __init__
  • 使用 __new__

使用 __init__

__init__ 方法是用于初始化新创建的对象的实例方法。当从类创建对象时,它会自动调用。

如果我们将此方法与 static 方法一起使用并提供必要的检查,即类的实例是否已经存在,我们可以在创建第一个对象后限制新对象的创建。

在下面的示例中,我们将使用 __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("Object exist!")
	 	 	 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 类,可以重写此方法。

在重写的方法中,首先检查类的实例是否已经存在。如果没有(即,如果实例为 None),则调用 super() 方法来创建一个新对象。最后,将此实例保存在 class 属性中并返回结果。

在下面的示例中,我们将使用 __new__ 方法创建一个单例类。


class SingletonClass:
	 	_instance = None
	 	
	 	def __new__(cls):
	 	 	 if cls._instance is None:
	 	 	 	 	print('Creating the object')
	 	 	 	 	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>