Python - Referensi Lemah
Halo, para pemrogram berbakat! Hari ini, kita akan menyelam ke dunia yang menarik tentang referensi lemah di Python. Jangan khawatir jika Anda masih baru dalam pemrograman – saya akan memandu Anda melalui konsep ini langkah demi langkah, sama seperti yang saya lakukan untuk banyak siswa selama tahun-tahun mengajar saya. Jadi, mari kita mulai perjalanan yang menarik ini bersama-sama!
Apa itu Referensi Lemah?
Sebelum kita melompat ke rincian, mari kita mengerti apa itu referensi lemah. Bayangkan Anda di acara sebuah pesta, dan Anda bertemu dengan seseorang baru. Anda mungkin mengenali wajahnya, tetapi tidak neceserai mengenali namanya. Itulah sedikit seperti referensi lemah di Python!
Dalam istilah pemrograman, referensi lemah memungkinkan Anda untuk mengacu ke sebuah objek tanpa menambahkan jumlah referensi objek itu. Ini berarti bahwa objek tersebut dapat dikumpulkan oleh penyusutan (dibersihkan oleh Python) bahkan jika masih ada referensi lemah yang menunjuk kepadanya.
Mari kita lihat contoh sederhana:
import weakref
class Party:
def __init__(self, name):
self.name = name
# Membuat objek Party
awesome_party = Party("Pesta Programmer Python")
# Membuat referensi lemah ke pesta
weak_party = weakref.ref(awesome_party)
# Mengakses objek melalui referensi lemah
print(weak_party().name) # Output: Pesta Programmer Python
# Menghapus objek asli
del awesome_party
# Mencoba mengakses objek lagi
print(weak_party()) # Output: None
Dalam contoh ini, kita membuat sebuah objek Party
dan sebuah referensi lemah kepadanya. Kita dapat mengakses objek melalui referensi lemah, tetapi ketika kita menghapus objek asli, referensi lemah mengembalikan None
.
Fungsi Callback
Sekarang, mari kita tambahkan sedikit kegembiraan ke referensi lemah kita dengan fungsi callback. Ini seperti beberapa pembantu yang melompat kedalam aksi saat sebuah objek akan dikumpulkan oleh penyusutan.
import weakref
def party_over(reference):
print("Pesta sudah berakhir! Waktu untuk membersihkan.")
class Party:
def __init__(self, name):
self.name = name
awesome_party = Party("Pesta Koder Python")
weak_party = weakref.ref(awesome_party, party_over)
del awesome_party
# Output: Pesta sudah berakhir! Waktu untuk membersihkan.
Di sini, fungsi party_over
dipanggil saat objek awesome_party
akan dikumpulkan oleh penyusutan. Itu seperti memiliki seorang teman yang tanggung jawab yang mengingatkan Anda untuk membersihkan setelah pesta!
Finalisasi Objek
Terkadang, kita ingin melakukan beberapa tindakan sebelum sebuah objek dikumpulkan oleh penyusutan. Ini tempat finalizer menjadi berguna. Ini seperti ucapan terakhir dari sebuah objek sebelum ia memberikan pengertian.
import weakref
class Party:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Membersihkan setelah {self.name}")
awesome_party = Party("Pesta Piknik Python")
weak_party = weakref.ref(awesome_party)
del awesome_party
# Output: Membersihkan setelah Pesta Piknik Python
Dalam contoh ini, metode __del__
bertindak sebagai finalizer, mencetak pesan saat objek akan dikumpulkan oleh penyusutan.
WeakKeyDictionary
Sekarang, mari kita berbicara tentang jenis khusus dari kamus – WeakKeyDictionary. Ini seperti kamus reguler, tapi dengan penyorotan: kuncinya adalah referensi lemah!
import weakref
class Attendee:
def __init__(self, name):
self.name = name
party_roles = weakref.WeakKeyDictionary()
alice = Attendee("Alice")
bob = Attendee("Bob")
party_roles[alice] = "DJ"
party_roles[bob] = "Penari"
print(party_roles[alice]) # Output: DJ
print(party_roles[bob]) # Output: Penari
del alice
print(list(party_roles.keys())) # Output: [<__main__.Attendee object at ...>]
Dalam contoh ini, saat kita menghapus alice
, entri nya di kamus party_roles
secara otomatis dihapus. Itu seperti dia meninggalkan pesta tanpa memberitahu siapa pun!
WeakValueDictionary
Terakhir tapi tidak terkebih dahulu, mari kita berkenalan dengan WeakValueDictionary. kali ini, itu adalah nilai yang menjadi referensi lemah, bukan kunci.
import weakref
class Party:
def __init__(self, name):
self.name = name
scheduled_parties = weakref.WeakValueDictionary()
summer_bash = Party("Pesta Musim Panas")
winter_gala = Party("Pesta Musim dingin")
scheduled_parties["Juni"] = summer_bash
scheduled_parties["Desember"] = winter_gala
print(scheduled_parties["Juni"].name) # Output: Pesta Musim Panas
del summer_bash
print(list(scheduled_parties.keys())) # Output: ['Desember']
Di sini, saat kita menghapus summer_bash
, entri nya di kamus scheduled_parties
menghilang secara otomatis. Itu seperti pesta tersebut dibatalkan tanpa siapa pun mengupdate jadwal!
Penutup
Dan itu tadi, teman-teman! Kita telah melakukan perjalanan melalui wilayah referensi lemah di Python. Dari referensi lemah dasar hingga fungsi callback, finalizer, dan kamus lemah, Anda sudah memiliki dasar yang solid dalam konsep yang kuat ini.
Ingat, referensi lemah adalah seperti tamu pesta yang sopan – mereka tidak terlalu lama tinggal dan tahu kapan saatnya untuk pergi. Mereka sangat berguna untuk mengelola memori secara efisien dan menghindari referensi sirkular.
Sebagai Anda melanjutkan petualangan Python Anda, ingatlah konsep ini. Mereka mungkin hanya akan berguna ketika Anda sedang tidak mengharapkan itu!
Method/Class | Deskripsi |
---|---|
weakref.ref() |
Membuat referensi lemah ke objek |
weakref.proxy() |
Membuat proxy untuk referensi lemah |
weakref.getweakrefcount() |
Mengembalikan jumlah referensi lemah ke objek |
weakref.getweakrefs() |
Mengembalikan daftar semua referensi lemah ke objek |
weakref.WeakKeyDictionary() |
Membuat kamus dengan referensi lemah sebagai kunci |
weakref.WeakValueDictionary() |
Membuat kamus dengan referensi lemah sebagai nilai |
weakref.finalize() |
Mendaftarkan fungsi finalizer untuk dipanggil saat objek dikumpulkan oleh penyusutan |
Selamat coding, dan semoga petualangan Python Anda penuh dengan penemuan yang menarik!
Credits: Image by storyset