__ yếu __ trong python là gì?

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ã sau

import  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

Ví dụ Python số 3. Xem ví dụ mã sau

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ã sau

def _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ã sau

def 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ã sau

def 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

Khi nào nên sử dụng Weakref Python?

Python chứa mô-đun yếu tham chiếu tạo tham chiếu yếu đến một đối tượng. Nếu không có tham chiếu mạnh đến một đối tượng, trình thu gom rác có thể tự do sử dụng bộ nhớ cho các mục đích khác. Tham chiếu yếu được sử dụng để triển khai bộ đệm và ánh xạ chứa dữ liệu lớn .

Làm thế nào để một tài liệu tham khảo yếu làm việc?

Trình thu gom rác không thể thu thập đối tượng đang được ứng dụng sử dụng trong khi mã của ứng dụng có thể tiếp cận đối tượng đó. Ứng dụng được cho là có tham chiếu mạnh đến đối tượng. Tham chiếu yếu cho phép trình thu gom rác thu thập đối tượng trong khi vẫn cho phép ứng dụng truy cập đối tượng .

C++ tham chiếu yếu là gì?

Trong lập trình máy tính, tham chiếu yếu là tham chiếu không bảo vệ đối tượng được tham chiếu khỏi bộ thu gom rác , không giống như tham chiếu mạnh .

Chủ Đề