آموزش پایتون - کلاس سینگلتون

در پایتون، یک کلاس سینگلتون (Singleton) پیاده‌سازی الگوی طراحی سینگلتون است؛ به این معنی که این نوع کلاس می‌تواند تنها یک شیء (Object) داشته باشد. این امر به بهینه‌سازی مصرف حافظه هنگام انجام عملیات‌های سنگین، مانند ایجاد اتصال به پایگاه داده، کمک می‌کند.

اگر تلاش کنیم چندین شیء برای یک کلاس سینگلتون ایجاد کنیم، شیء تنها برای بار اول ایجاد می‌شود. پس از آن، همان نمونه شیء قبلی برگردانده خواهد شد.

ایجاد کلاس‌های سینگلتون در پایتون

ما می‌توانیم کلاس‌های سینگلتون را در پایتون با استفاده از روش‌های زیر ایجاد و پیاده‌سازی کنیم −

  • با استفاده از __init__
  • با استفاده از __new__

با استفاده از __init__

متد __init__ یک متد نمونه (Instance Method) است که برای مقداردهی اولیه به شیء تازه‌ایجادشده استفاده می‌شود. این متد به طور خودکار هنگام ایجاد یک شیء از روی کلاس فراخوانی می‌شود.

اگر از این متد همراه با یک متد استاتیک (Static Method) استفاده کنیم و بررسی‌های لازم را انجام دهیم (یعنی اینکه آیا نمونه‌ای از کلاس از قبل وجود دارد یا خیر)، می‌توانیم ایجاد شیء جدید را پس از ساخته شدن اولین شیء محدود کنیم.

مثال

در مثال زیر، ما در حال ایجاد یک کلاس سینگلتون با استفاده از متد __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__ یک متد استاتیک خاص در پایتون است که برای ایجاد یک نمونه جدید از یک کلاس فراخوانی می‌شود. این متد خودِ کلاس را به عنوان اولین آرگومان دریافت می‌کند و نمونه جدیدی از آن کلاس را برمی‌گرداند.

هنگامی که نمونه‌ای از یک کلاس پایتون تعریف می‌شود، متد ()__new__ به صورت داخلی فراخوانی می‌شود. اگر می‌خواهید یک کلاس سینگلتون پیاده‌سازی کنید، می‌توانید این متد را بازنویسی (Override) کنید.

در متد بازنویسی‌شده، ابتدا بررسی می‌کنید که آیا نمونه‌ای از کلاس از قبل وجود دارد یا خیر. اگر وجود ندارد (یعنی اگر نمونه برابر با None باشد)، متد ()super را برای ایجاد یک شیء جدید فراخوانی می‌کنید. در پایان، این نمونه را در یک صفت کلاسی (Class Attribute) ذخیره کرده و نتیجه را برمی‌گردانید.

مثال

در مثال زیر، ما در حال ایجاد یک کلاس سینگلتون با استفاده از متد __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>

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.