Trong lập trình, nếu chúng ta không muốn một đối tượng ở trong bộ nhớ suốt đời, chúng ta gọi một hàm hủy của lớp đó để hủy đối tượng. Điều này được thực hiện nếu chúng ta biết vòng đời của đối tượng. Trong Lập trình Java, Trình thu gom rác thực hiện tác vụ nếu chúng ta không tự chỉ định nó
Trong Lập trình Python, chúng ta có , đây là mô-đun python tích hợp cho phép chúng ta tạo các tham chiếu yếu đến các đối tượng
Ảnh tín dụng. Trung bình
Tài liệu tham khảo yếu trong Python có nghĩa là gì?
Theo tham chiếu yếu, chúng tôi muốn nói đến một tham chiếu yếu đến một đối tượng, Tham chiếu làm cho đối tượng tồn tại trong ngôn ngữ lập trình python. Tham chiếu yếu giúp trình thu gom rác dọn sạch bộ nhớ khỏi đối tượng nếu nó không còn bất kỳ tham chiếu nào
Các tham chiếu làm cho đối tượng tồn tại và trong python, nếu tham chiếu duy nhất đến một đối tượng là một tham chiếu yếu thì trình thu gom rác sẽ hủy tham chiếu đó và sẽ sử dụng lại bộ nhớ được cấp phát bởi đối tượng đó
Tại sao chúng ta cần tham chiếu yếu trong Python?
Lý do chính mà chúng ta cần các tham chiếu yếu trong python là để triển khai bộ đệm hoặc ánh xạ, chứa đối tượng lớn. Đối tượng lớn mà chúng ta không cần phải tồn tại, sau đó chúng ta tạo một tham chiếu yếu đến đối tượng đó
Ví dụ về Sử dụng tham chiếu yếu đến các đối tượng trong Python là gì?
Trường hợp sử dụng tốt nhất khi sử dụng tham chiếu yếu trong python là, giả sử chúng ta có một số đối tượng hình ảnh nhị phân lớn, chúng ta cần gán tên cho mỗi hình ảnh. nếu chúng tôi không biết về các tham chiếu yếu, chúng tôi sẽ sử dụng từ điển python, đối tượng hình ảnh sẽ tồn tại vì chúng tôi đã sử dụng nó trong ánh xạ. Nó là một ý tưởng tốt?
Giải pháp để lưu trữ các đối tượng tạm thời là gì?
Giải pháp lưu trữ các đối tượng lớn để sử dụng tạm thời, Một trong nhiều cách là sử dụng các tham chiếu yếu đến đối tượng đó trong ngôn ngữ lập trình python. Sử dụng các lớp WeakKeyDictionary và WeakKeyValueDictionary có sẵn trong có thể là cách tốt hơn để lưu trữ đối tượng tạm thời. Điều này sẽ đảm bảo rằng nếu không còn tham chiếu nào khác thì bộ thu gom rác có thể tự do dọn dẹp bộ nhớ
Ví dụ Python về yếu. giới thiệu[]
Trả về một tham chiếu yếu đến đối tượng. Đối tượng ban đầu có thể được truy xuất bằng cách gọi đối tượng tham chiếu nếu đối tượng tham chiếu vẫn còn sống;
Đây là một số ví dụ mà chúng tôi đã sử dụng yếu tố. phương thức ref[] có sẵn trong mô-đun python yếu. Ví dụ sau đây là trường hợp tốt nhất mà chúng ta có thể sử dụng yếu tố. phương thức giới thiệu []
Ví dụ Python số 1. Xem ví dụ mã sauimport weakref
def testNoCycles[self]:
case = unittest.TestCase[]
wr = weakref.ref[case]
with support.disable_gc[]:
del case
self.assertFalse[wr[]]
Ví dụ Python số 2. Xem ví dụ mã sau
import weakref
def obj_node_id[obj]:
if isinstance[obj, weakref.ref]:
return 'all_weakrefs_are_one'
return ['o%d' % id[obj]].replace['-', '_']
Ví dụ về yếu tố Python. WeakValueDictionary[]
Các đối tượng WeakValueDictionary có một phương thức bổ sung có cùng vấn đề như phương thức keyrefs[] của các đối tượng WeakKeyDictionary
def insert[self, index, value]:
assert self.ref_classdef.isinstance[value.classdef]
self.references.insert[index, self.next_free_key]
objects = {}
objects[index] = value
# increment all cached object with > indices +1
for key, value in self.objects.items[]:
if key >= index:
objects[key+1] = value
else:
objects[key] = value
self.next_free_key += 1
if self.attached:
self.objects = weakref.WeakValueDictionary[objects]
else:
self.objects = objects
self.attach[]
Ví dụ Python số 4. Xem ví dụ mã sau
def close[self]:
ref, self.ref = self.ref, None
close, self._close = self._close, None
referrers = self._referrers
self._referrers = weakref.WeakValueDictionary[]
for referrer in referrers.valuerefs[]:
referrer = referrer[]
if referrer is not None:
referrer.close[]
if ref is not None and close is not None:
close[ref]
Ví dụ về yếu tố Python. WeakKeyDictionary[]
WeakKeyDictionary là một lớp Ánh xạ tham chiếu các khóa một cách yếu ớt. Các mục nhập trong từ điển sẽ bị loại bỏ khi không còn tham chiếu mạnh đến khóa. Điều này có thể được sử dụng để liên kết dữ liệu bổ sung với một đối tượng thuộc sở hữu của các phần khác của ứng dụng mà không cần thêm thuộc tính cho các đối tượng đó. Điều này có thể đặc biệt hữu ích với các đối tượng ghi đè truy cập thuộc tính
Ví dụ Python số 5. Xem ví dụ mã saudef _make_cached_stream_func[src_func, wrapper_func]: cache = WeakKeyDictionary[] def func[]: stream = src_func[] try: rv = cache.get[stream] except Exception: rv = None if rv is not None: return rv rv = wrapper_func[] try: stream = src_func[] # In case wrapper_func[] modified the stream cache[stream] = rv except Exception: pass return rv return func
Ví dụ về yếu tố Python. Ủy quyền[]
Trả lại proxy cho một đối tượng sử dụng tham chiếu yếu. Điều này hỗ trợ việc sử dụng proxy trong hầu hết các ngữ cảnh thay vì yêu cầu hội thảo rõ ràng được sử dụng với các đối tượng tham chiếu yếu. Đối tượng được trả về sẽ có loại ProxyType hoặc CallableProxyType, tùy thuộc vào việc đối tượng có thể gọi được hay không. Các đối tượng proxy không thể băm được bất kể tham chiếu; . cuộc gọi lại giống với tham số cùng tên của hàm ref[]
Ví dụ Python số 6. Xem ví dụ mã saudef buildPenguin[self]:
self.handshakeStage = -1
self.canRecvPacket = False
self.ReceivePacketEnabled = True # Penguin can receive packet only if both this and self.canRecvPacket is true.
# Some XT packets are sent before J#JS to make sure client is alive, just to make sure to ignore it ;]
# ['category', 'handler', 0 or 1 : execute : don't execute]
self.ignorableXTPackets = [['s', 'j#js', 1], ['s', 'p#getdigcooldown', 0], ['s', 'u#h', 0], ['s', 'f#epfgf', 0], ['l', 'login', 1]]
self.penguin = PenguinObject[]
self.penguin.name = None
self.penguin.id = None
self.penguin.room = None
self.penguin.prevRooms = list[]
self.ref = weakref.proxy[self]
# Initiate Packet Handler
self.PacketHandler = PacketHandler[self.ref]
self.CryptoHandler = Crypto[self.ref]
Ví dụ về yếu. hoàn thiện[]
Lợi ích chính của việc sử dụng hoàn thiện là giúp đăng ký gọi lại đơn giản mà không cần bảo toàn đối tượng hoàn thiện được trả về. Nếu bạn tạo một đối tượng bộ hoàn thiện trong luồng trình nền ngay khi chương trình thoát thì có khả năng bộ hoàn thiện không được gọi khi thoát. Tuy nhiên, trong một chủ đề daemon atexit. đăng ký [], hãy thử. . cuối cùng. . và với. . không đảm bảo rằng việc dọn dẹp xảy ra hoặc
Ví dụ Python số 7. Xem ví dụ mã saudef run_in_child[cls]:
def error[]:
# Create an atexit finalizer from inside a finalizer called
# at exit. This should be the next to be run.
g1 = weakref.finalize[cls, print, 'g1']
print['f3 error']
1/0
# cls should stay alive till atexit callbacks run
f1 = weakref.finalize[cls, print, 'f1', _global_var]
f2 = weakref.finalize[cls, print, 'f2', _global_var]
f3 = weakref.finalize[cls, error]
f4 = weakref.finalize[cls, print, 'f4', _global_var]
assert f1.atexit == True
f2.atexit = False
assert f3.atexit == True
assert f4.atexit == True
Tóm tắt và Kết luận
Sử dụng mô-đun yếu, nếu bạn muốn sử dụng các tham chiếu tuần bằng ngôn ngữ lập trình python. Như chúng ta đã thảo luận rằng mô-đun yếu tham chiếu rất hữu ích trong việc tạo các tham chiếu yếu, Chúng tôi cũng đã sử dụng mô-đun này trong một số ví dụ, nếu bạn vẫn còn bất kỳ nghi ngờ nào, vui lòng cho tôi biết qua số WhatsApp của tôi +923159675198. Ngoài ra, vui lòng xem tài liệu chính thức về mô-đun yếu của Python