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!

Python - Weak References

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