Python - Kelas Singleton

Hai pelajar-pelajar yang gemar dengan pengaturcaraan! Hari ini, kita akan memulakan perjalanan yang menarik ke atas dunia pengaturcaraan Python. Destinasi kita? Negara maya Singleton Classes! Jangan khawatir jika ini听起来 agak menakutkan – saya berjanji bahwa pada akhir tutorial ini, anda akan menjadi seorang master Singleton. Jadi, mari kita melompat masuk!

Python - Singleton Class

Apa itu Kelas Singleton?

Sebelum kita mula untuk mengkod, mari kita fahami apa itu kelas Singleton. Bayangkan anda sedang bermain permainan video, dan hanya ada satu rakannya yang anda kawal sepanjang permainan. Apa jua kali anda menyimpan dan memuat semula permainan, anda sentiasa mengawal rakannya yang sama. Itulah yang kelas Singleton lakukan dalam pengaturcaraan – ia memastikan bahwa kelas hanya ada satu instance, dan menyediakan satu titik akses global kepadanya.

Membuat Kelas Singleton di Python

Di Python, ada beberapa cara untuk membuat kelas Singleton. Kita akan menjelajahi dua cara utama: menggunakan __init__ dan menggunakan __new__. Tetapi terlebih dahulu, mari kita lihat kenapa kita mungkin perlu kelas Singleton.

Mengapa Gunakan Singleton?

Singleton berguna apabila anda ingin memastikan hanya ada satu instance bagi kelas tersebut di seluruh program anda. Ini boleh membantu untuk:

  1. Menguruskan keadaan global
  2. Koordinasi tindakan di seluruh sistem
  3. Menguruskan sumber yang dikongsi, seperti sambungan pangkalan data

Sekarang, mari kita kenaikan tangan dan mula untuk mengkod!

Menggunakan init

Cara pertama kita melibatkan penggunaan method __init__, yang dipanggil apabila objek dicipta. Ini cara kita boleh membuat Singleton menggunakan __init__:

class Singleton:
_instance = None

def __init__(self):
if Singleton._instance is None:
Singleton._instance = self
else:
raise Exception("Kelas ini adalah singleton!")

@staticmethod
def get_instance():
if Singleton._instance is None:
Singleton()
return Singleton._instance

# Penggunaan
s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
print(s1 is s2)  # Output: True

# Ini akan memunculkan pengecualian
# s3 = Singleton()

Mari kita kongsi ini:

  1. Kita definisikan satu pembolehubah kelas _instance untuk menahan instance tunggal kita.
  2. Di dalam method __init__, kita periksa jika instance sudah wujud. Jika tidak, kita cipta satu. Jika ya, kita memunculkan pengecualian.
  3. Kita menyediakan satu method get_instance() untuk mengakses Singleton kita. Method ini mencipta instance jika belum wujud, atau kembalikan instance yang ada.

Apabila kita menjalankan kod ini, s1 dan s2 akan menjadi instance yang sama. Cubaan untuk membuat instance baru secara langsung (seperti s3 = Singleton()) akan memunculkan pengecualian.

Menggunakan new

Sekarang, mari kita lihat satu cara lain menggunakan __new__. Method ini dipanggil sebelum __init__ apabila mencipta instance baru.

class Singleton:
_instance = None

def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance

# Penggunaan
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # Output: True

Berikut adalah yang berlaku:

  1. Kita menimpa method __new__, yang bertanggungjawab untuk mencipta dan mengembalikan instance baru.
  2. Jika _instance adalah None, kita cipta instance baru menggunakan super().__new__(cls).
  3. Kita sentiasa kembalikan _instance, sama ada ia baru dicipta atau sudah wujud.

Cara ini adalah lebih ringkas dan tidak memerlukan method get_instance() yang berasingan.

Membandingkan Dua Cara

Mari kita bandingkan kedua cara ini di atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas atas

Credits: Image by storyset