Python - Singleton Class

Trong Python, một Singleton class là việc triển khai mẫu thiết kế singleton, có nghĩa là loại lớp này chỉ có thể có một đối tượng duy nhất. Điều này giúp tối ưu hóa việc sử dụng bộ nhớ khi bạn thực hiện một số thao tác nặng, chẳng hạn như tạo kết nối cơ sở dữ liệu.

Nếu chúng ta cố gắng tạo nhiều đối tượng cho một lớp singleton, đối tượng sẽ chỉ được tạo ra lần đầu tiên. Sau đó, cùng một thể hiện đối tượng sẽ được trả về.

Creating Singleton Classes in Python

Chúng ta có thể tạo và triển khai các lớp singleton trong Python bằng các cách sau đây −

  • using __init__
  • using __new__

Using __init__

Phương thức __init__ là một phương thức của thể hiện (instance method) được sử dụng để khởi tạo một đối tượng mới được tạo ra. Nó được gọi tự động khi một đối tượng được tạo ra từ một lớp.

Nếu chúng ta sử dụng phương pháp này với một phương thức tĩnh và cung cấp các kiểm tra cần thiết, tức là, xem một thể hiện của lớp đã tồn tại hay chưa, chúng ta có thể hạn chế việc tạo ra một đối tượng mới sau khi đối tượng đầu tiên được tạo ra.

Example

Trong ví dụ dưới đây, chúng ta đang tạo một lớp singleton bằng cách sử dụng phương thức __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)

Khi chúng ta chạy đoạn mã trên, nó sẽ hiển thị kết quả sau −

<__main__.Singleton object at 0x7e4da068a910>
<__main__.Singleton object at 0x7e4da068a910>

Using __new__

Phương thức __new__ là một phương thức tĩnh đặc biệt trong Python được gọi để tạo một thể hiện mới của một lớp. Nó nhận lớp đó làm đối số đầu tiên và trả về một thể hiện mới của lớp đó.

Khi một thể hiện của một lớp Python được khai báo, nó sẽ gọi nội bộ phương thức __new__(). Nếu bạn muốn triển khai một lớp Singleton, bạn có thể ghi đè phương thức này.

Trong phương thức bị ghi đè, trước tiên bạn kiểm tra xem một thể hiện của lớp đã tồn tại hay chưa. Nếu chưa (tức là nếu thể hiện là None), bạn gọi phương thức super() để tạo một đối tượng mới. Cuối cùng, lưu thể hiện này vào một thuộc tính của lớp và trả về kết quả.

Example

Trong ví dụ dưới đây, chúng ta đang tạo một lớp singleton bằng cách sử dụng phương thức __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)

Mã trên cho kết quả sau −

Creating the object
<__main__.SingletonClass object at 0x000002A5293A6B50>
<__main__.SingletonClass object at 0x000002A5293A6B50>