Python - 單例類



在 Python 中,單例類 是單例設計模式的實現,這意味著這種型別的類只能有一個物件。當執行一些繁重的操作(例如建立資料庫連線)時,這有助於最佳化記憶體使用。

如果我們嘗試為單例類建立多個物件,則物件將僅在第一次建立。之後,將返回相同的物件例項。

在 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("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__() 方法。如果要實現單例類,可以重寫此方法。

在重寫的方法中,首先檢查類例項是否已存在。如果不存在(即例項為 None),則呼叫 super() 方法建立一個新物件。最後,將此例項儲存在類屬性中並返回結果。

示例

在以下示例中,我們使用 __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>
廣告