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!
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:
- Menguruskan keadaan global
- Koordinasi tindakan di seluruh sistem
- 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:
- Kita definisikan satu pembolehubah kelas
_instance
untuk menahan instance tunggal kita. - Di dalam method
__init__
, kita periksa jika instance sudah wujud. Jika tidak, kita cipta satu. Jika ya, kita memunculkan pengecualian. - 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:
- Kita menimpa method
__new__
, yang bertanggungjawab untuk mencipta dan mengembalikan instance baru. - Jika
_instance
adalah None, kita cipta instance baru menggunakansuper().__new__(cls)
. - 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