Python - Rujukan Lemah
Halo, para pelopor yang berhasrat! Hari ini, kita akan menyelam ke atas dunia yang menarik tentang rujukan lemah di dalam Python. Jangan khawatir jika anda baru mengenal pemrograman – Saya akan memandu anda melalui konsep ini langkah demi langkah, seperti yang saya lakukan untuk pelbagai pelajar selama tahun tahun mengajar saya. Jadi, mari kita melakukan perjalanan yang menarik ini bersama-sama!
Apakah itu Rujukan Lemah?
Sebelum kita melompat ke atas butiran, mari kita fahami apa itu rujukan lemah. Bayangkan anda di atas sebuah perayaan, dan anda bertemu dengan seseorang baru. Anda mungkin dapat mengingat wajahnya, tetapi tidak semestinya nama mereka. Itu adalah seperti rujukan lemah di dalam Python!
Dalam istilah pemrograman, rujukan lemah membolehkan anda untuk merujuk kepada sebuah objek tanpa meningkatkan rakannya. Ini berarti bahwa objek tersebut boleh dikumpulkan rakit (dibersihkan oleh Python) walaupun masih ada rujukan lemah yang menunjuk kepadanya.
Mari lihat contoh yang sederhana:
import weakref
class Party:
def __init__(self, name):
self.name = name
# Buat satu objek Party
awesome_party = Party("Python Programmers' Bash")
# Buat satu rujukan lemah kepada perayaan
weak_party = weakref.ref(awesome_party)
# Akses objek melalui rujukan lemah
print(weak_party().name) # Output: Python Programmers' Bash
# Padam objek asal
del awesome_party
# Cuba untuk mengakses objek lagi
print(weak_party()) # Output: None
Dalam contoh ini, kita membuat satu objek Party
dan satu rujukan lemah kepadanya. Kita boleh mengakses objek melalui rujukan lemah, tetapi apabila kita padam objek asal, rujukan lemah mengembalikan None
.
Fungsi Callback
Sekarang, mari kita tambahkan sedikit khas kepada rujukan lemah kita dengan fungsi callback. Ini adalah seperti rakannya penyedia yang melompat untuk bertindak apabila objek akan dikumpulkan rakit.
import weakref
def party_over(reference):
print("Perayaan telah berakhir! Waktu untuk membersihkan.")
class Party:
def __init__(self, name):
self.name = name
awesome_party = Party("Python Coders' Fiesta")
weak_party = weakref.ref(awesome_party, party_over)
del awesome_party
# Output: Perayaan telah berakhir! Waktu untuk membersihkan.
Di sini, fungsi party_over
dipanggil apabila objek awesome_party
akan dikumpulkan rakit. Itu adalah seperti memiliki rakannya rakan yang bertanggungjawab yang mengingatkan anda untuk membersihkan selepas perayaan!
Mengakhiri Objek
Pada masa yang lain, kita mahu melakukan beberapa tindakan sebelum objek dikumpulkan rakit. Ini adalah di mana pengakhiran datang untuk membantu. Mereka adalah seperti rakannya terakhir untuk objek sebelum mereka bersurai.
import weakref
class Party:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Membersihkan selepas {self.name}")
awesome_party = Party("Python Picnic")
weak_party = weakref.ref(awesome_party)
del awesome_party
# Output: Membersihkan selepas Python Picnic
Dalam contoh ini, metode __del__
bertindak sebagai pengakhiran, mencetak mesej apabila objek akan dikumpulkan rakit.
WeakKeyDictionary
Sekarang, mari kita bercakap tentang jenis khas dictionary – WeakKeyDictionary. Ia seperti dictionary biasa, tetapi dengan satu putaran: kuncinya adalah rujukan 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, apabila kita padam alice
, rakannya di atas party_roles
dictionary dihapus secara automatik. Itu adalah seperti dia meninggalkan perayaan tanpa memberitahu sesiapa pun!
WeakValueDictionary
Terakhir tetapi tidak diabaikan, mari kita bertemu dengan WeakValueDictionary. kali ini, nilai-nilai adalah rujukan lemah, bukan kunci-kunci.
import weakref
class Party:
def __init__(self, name):
self.name = name
scheduled_parties = weakref.WeakValueDictionary()
summer_bash = Party("Summer Bash")
winter_gala = Party("Winter Gala")
scheduled_parties["June"] = summer_bash
scheduled_parties["December"] = winter_gala
print(scheduled_parties["June"].name) # Output: Summer Bash
del summer_bash
print(list(scheduled_parties.keys())) # Output: ['December']
Di sini, apabila kita padam summer_bash
, rakannya di atas scheduled_parties
dictionary hilang secara automatik. Itu adalah seperti rakannya dibatalkan tanpa sesiapa pun mengemas kini jadwal!
Penutup
Dan itu adalah untuk saat ini, rakyat! Kita telah melakukan perjalanan melalui wilayah rujukan lemah di dalam Python. Dari rujukan lemah asas hingga fungsi callback, pengakhiran, dan rakannya dictionary, anda kini memiliki fondasi yang kuat dalam konsep yang kuat ini.
Ingat, rujukan lemah adalah seperti rakannya tetamu perayaan yang sopan – mereka tidak melamun terlalu lama dan tahu apabila adalah waktunya untuk pergi. Mereka sangat berguna untuk mengurus memori dengan efisiensi dan mengelakkan rakannya berputar.
Apabila anda teruskan perjalanan Python anda, ingat konsep ini. Mereka mungkin hanya datang untuk membantu apabila anda terkejut paling tidak!
Method/Class | Keterangan |
---|---|
weakref.ref() |
Membuat satu rujukan lemah kepada objek |
weakref.proxy() |
Membuat satu proksi untuk rujukan lemah |
weakref.getweakrefcount() |
Mengembalikan rakannya jumlah rujukan lemah kepada objek |
weakref.getweakrefs() |
Mengembalikan satu senarai semua rujukan lemah kepada objek |
weakref.WeakKeyDictionary() |
Membuat satu dictionary dengan rujukan lemah sebagai kunci |
weakref.WeakValueDictionary() |
Membuat satu dictionary dengan rujukan lemah sebagai nilai |
weakref.finalize() |
Mendaftar satu fungsi pengakhiran untuk dipanggil apabila objek dikumpulkan rakit |
Selamat coding, dan may your Python journey be filled with exciting discoveries!
Credits: Image by storyset