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!

Python - Weak References

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