Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tham chiếu yếu (Weak References) trong Python

Để tạo tham chiếu yếu (weak references) trong Python, ta cần dùng module weakref. Weakref không đủ để giữ đối tượng sống (alive). Một trường hợp sử dụng cơ bản của weak reference là triển khai cache hoặc mapping cho đối tượng lớn.

Để dùng module này, nên nhập bằng:

import weakref

Không phải đối tượng nào cũng có thể được tham chiếu yếu. Một số kiểu built-in như tuple hoặc int, không hỗ trợ weak reference. Có một số lớp và phương thức liên quan đến weak reference.

Lớp weakref.ref(object[, callback])

Trả về một weak reference đến đối tượng. Khi referent (đối tượng được tham chiếu) vẫn còn sống, đối tượng thực tế có thể được lấy lại bằng cách gọi đối tượng reference, nhưng khi đối tượng thực tế không còn tồn tại, nó sẽ trả về None.

Phương thức weakref.proxy(object[, callback])

Trả về một proxy cho đối tượng, sử dụng weak reference. Đối tượng trả về có thể là ProxyType hoặc CallableProxyType.

Phương thức weakref.getweakrefcount(object)

Trả về số lượng weak references và proxies của đối tượng.

Phương thức weakref.getweakrefs(object)

Trả về danh sách các đối tượng weak references và proxies.

Mã ví dụ

import weakref

class my_list(list):
    pass

new_list = my_list('String')  # Dùng class my_list để định nghĩa list
print(new_list)

weak_ref = weakref.ref(new_list)
new_weak_list = weak_ref()
new_proxy = weakref.proxy(new_list)

print(new_weak_list)
print('Đối tượng dùng proxy: ' + str(new_proxy))

if new_list is new_weak_list:
    print("Có weak reference")

print('Số lượng Weak references: ' + str(weakref.getweakrefcount(new_list)))

del new_list, new_weak_list  # Xóa cả hai đối tượng
print("Weak reference là: " + str(weak_ref()))

Kết quả

['S', 't', 'r', 'i', 'n', 'g']
['S', 't', 'r', 'i', 'n', 'g']
Đối tượng dùng proxy: ['S', 't', 'r', 'i', 'n', 'g']
Có weak reference
Số lượng Weak references: 2
Weak reference là: None