Hướng dẫn what is a weak reference python - Python tham chiếu yếu là gì

Python hỗ trợ các tài liệu tham khảo yếu như các đối tượng hạng nhất. Có hai loại đối tượng cụ thể trực tiếp thực hiện các tài liệu tham khảo yếu. Đầu tiên là một đối tượng tham chiếu đơn giản và thứ hai hoạt động như một proxy cho đối tượng gốc càng nhiều càng tốt.

intpyweakref_check (ob) return true nếu ob là một đối tượng tham chiếu hoặc proxy. Chức năng này luôn thành công. PyWeakref_Check(ob)

Return true if ob is either a reference or proxy object. This function always succeeds.

intpyweakref_checkref (ob) return true nếu ob là một đối tượng tham chiếu. Chức năng này luôn thành công. PyWeakref_CheckRef(ob)

Return true if ob is a reference object. This function always succeeds.

intpyweakref_checkproxy (ob) return true nếu ob là một đối tượng proxy. Chức năng này luôn thành công. PyWeakref_CheckProxy(ob)

Return true if ob is a proxy object. This function always succeeds.

PyObject*pyweakref_newref (pyObject*ob, pyObject*gọi lại) Giá trị return: tham chiếu mới. Một phần của ABI ổn định.*PyWeakref_NewRef(PyObject*ob, PyObject*callback)
Return value: New reference. Part of the Stable ABI.

Trả về một đối tượng tham chiếu yếu cho đối tượng OB. Điều này sẽ luôn trả về một tài liệu tham khảo mới, nhưng không được đảm bảo để tạo một đối tượng mới; Một đối tượng tham chiếu hiện có có thể được trả về. Tham số thứ hai, gọi lại, có thể là một đối tượng có thể gọi được nhận thông báo khi OB được thu thập rác; Nó sẽ chấp nhận một tham số duy nhất, đó sẽ là chính đối tượng tham chiếu yếu. Gọi lại cũng có thể là None hoặc NULL. Nếu OB không phải là một đối tượng có thể tham chiếu yếu hoặc nếu gọi lại không thể gọi được, None hoặc NULL, điều này sẽ trả về NULL và tăng

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
0.

PyObject*pyweakref_newproxy (pyObject*ob, pyObject*gọi lại) Giá trị return: tham chiếu mới. Một phần của ABI ổn định.*PyWeakref_NewProxy(PyObject*ob, PyObject*callback)
Return value: New reference. Part of the Stable ABI.

Trả về một đối tượng proxy tham chiếu yếu cho đối tượng ob. Điều này sẽ luôn trả về một tài liệu tham khảo mới, nhưng không được đảm bảo để tạo một đối tượng mới; Một đối tượng proxy hiện có có thể được trả về. Tham số thứ hai, gọi lại, có thể là một đối tượng có thể gọi được nhận thông báo khi OB được thu thập rác; Nó sẽ chấp nhận một tham số duy nhất, đó sẽ là chính đối tượng tham chiếu yếu. Gọi lại cũng có thể là None hoặc NULL. Nếu OB không phải là một đối tượng có thể tham chiếu yếu hoặc nếu gọi lại không thể gọi được, None hoặc NULL, điều này sẽ trả về NULL và tăng

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
0.

PyObject*pyweakref_getObject (pyObject*ref) Giá trị return: tham chiếu mượn. Một phần của ABI ổn định.*PyWeakref_GetObject(PyObject *ref)
Return value: Borrowed reference. Part of the Stable ABI.

Trả về đối tượng được tham chiếu từ một tài liệu tham khảo yếu, ref. Nếu người giới thiệu không còn tồn tại, hãy trả về

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
7.

Ghi chú

Hàm này trả về một tham chiếu mượn cho đối tượng được tham chiếu. Điều này có nghĩa là bạn nên luôn luôn gọi

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
8 trên đối tượng ngoại trừ khi nó không thể bị phá hủy trước khi sử dụng cuối cùng của tài liệu tham khảo đã mượn.borrowed reference to the referenced object. This means that you should always call
import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
8 on the object except when it cannot be destroyed before the last usage of the borrowed reference.

PyObject*pyweakref_get_object (pyobject*ref) Giá trị return: tham chiếu mượn.*PyWeakref_GET_OBJECT(PyObject *ref)
Return value: Borrowed reference.

Tương tự như

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.
9, nhưng không kiểm tra lỗi.

Tôi đã cố gắng hiểu làm thế nào các danh sách tham chiếu/từ điển của Python hoạt động như thế nào. Tôi đã đọc tài liệu cho nó, tuy nhiên tôi không thể tìm ra cách chúng hoạt động và những gì chúng có thể được sử dụng. Bất cứ ai có thể cho tôi một ví dụ cơ bản về những gì họ làm và một lời giải thích về cách họ làm việc?

(Chỉnh sửa) Sử dụng mã của Thomas, khi tôi thay thế OBJ cho

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
0, nó ném: Using Thomas's code, when i substitute obj for
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
0 it throws:

Traceback (most recent call last):
File "C:/Users/nonya/Desktop/test.py", line 9, in 
r = weakref.ref(obj)
TypeError: cannot create weak reference to 'list' object

Hướng dẫn what is a weak reference python - Python tham chiếu yếu là gì

hỏi ngày 28 tháng 3 năm 2012 lúc 12:57Mar 28, 2012 at 12:57

Hướng dẫn what is a weak reference python - Python tham chiếu yếu là gì

Học thuyết

Số lượng tham chiếu thường hoạt động như vậy: Mỗi lần bạn tạo tham chiếu đến một đối tượng, nó được tăng lên một và bất cứ khi nào bạn xóa một tham chiếu, nó sẽ giảm một.

Tài liệu tham khảo yếu cho phép bạn tạo tham chiếu đến một đối tượng sẽ không tăng số lượng tham chiếu.

Số lượng tham chiếu được sử dụng bởi bộ thu gom rác của Python khi nó chạy: bất kỳ đối tượng nào có số lượng tham chiếu là 0 sẽ được thu thập rác.

Bạn sẽ sử dụng các tài liệu tham khảo yếu cho các đối tượng đắt tiền hoặc để tránh các tài liệu tham khảo vòng tròn (mặc dù người thu gom rác thường tự làm điều đó).

Cách sử dụng

Đây là một ví dụ hoạt động chứng minh cách sử dụng của họ:

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it's there.

obj = 1 #Let's change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.

Đã trả lời ngày 28 tháng 3 năm 2012 lúc 13:09Mar 28, 2012 at 13:09

Thomas Orozcothomas OrozcoThomas Orozco

51.1k9 Huy hiệu vàng110 Huy hiệu bạc115 Huy hiệu đồng9 gold badges110 silver badges115 bronze badges

8

Chỉ muốn chỉ ra rằng Feakref.ref không hoạt động cho danh sách tích hợp vì không có

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
1 trong danh sách
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
2. Ví dụ: mã sau đây xác định một thùng chứa danh sách hỗ trợ yếu.

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)

Hướng dẫn what is a weak reference python - Python tham chiếu yếu là gì

Đã trả lời ngày 18 tháng 12 năm 2014 lúc 5:17Dec 18, 2014 at 5:17

Jichijichijichi

5,8151 Huy hiệu vàng31 Huy hiệu bạc25 Huy hiệu đồng1 gold badge31 silver badges25 bronze badges

1

Vấn đề là chúng cho phép các tài liệu tham khảo được giữ lại cho các đối tượng mà không ngăn chúng được thu thập rác.

Hai lý do chính tại sao bạn muốn đây là nơi bạn thực hiện quản lý tài nguyên định kỳ của riêng bạn, ví dụ: Đóng các tập tin, nhưng vì thời gian giữa các lần vượt qua như vậy có thể dài, người thu gom rác có thể làm điều đó cho bạn; Hoặc nơi bạn tạo một đối tượng và nó có thể tương đối tốn kém để theo dõi nơi nó ở trong chương trình, nhưng bạn vẫn muốn đối phó với các trường hợp thực sự tồn tại.

Trường hợp thứ hai có lẽ là phổ biến hơn - nó phù hợp khi bạn đang giữ, ví dụ: Một danh sách các đối tượng để thông báo và bạn không muốn hệ thống thông báo để ngăn chặn thu gom rác.

Đã trả lời ngày 28 tháng 3 năm 2012 lúc 13:05Mar 28, 2012 at 13:05

MarcinmarcinMarcin

47.5K17 Huy hiệu vàng125 Huy hiệu bạc198 Huy hiệu đồng17 gold badges125 silver badges198 bronze badges

2

Dưới đây là ví dụ so sánh

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
3 và
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
4:

class C: pass
ci=C()
print(ci)

wvd = weakref.WeakValueDictionary({'key' : ci})
print(dict(wvd), len(wvd)) #1
del ci
print(dict(wvd), len(wvd)) #0

ci2=C()
d=dict()
d['key']=ci2
print(d, len(d))
del ci2
print(d, len(d))

Và đây là đầu ra:

<__main__.C object at 0x00000213775A1E10>
{'key': <__main__.C object at 0x00000213775A1E10>} 1
{} 0
{'key': <__main__.C object at 0x0000021306B0E588>} 1
{'key': <__main__.C object at 0x0000021306B0E588>} 1

Lưu ý làm thế nào trong trường hợp đầu tiên một khi chúng ta

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
5 đối tượng thực tế cũng sẽ bị xóa khỏi từ điển
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
6.

Trong trường hợp hoặc lớp từ điển Python thông thường

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
3, chúng ta có thể cố gắng xóa đối tượng nhưng nó vẫn sẽ ở đó như được hiển thị.


Lưu ý: Nếu chúng tôi sử dụng

import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
8, chúng tôi sẽ không gọi
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
9 sau đó, vì chỉ
import weakref

class weaklist(list):
    __slots__ = ('__weakref__',)

l = weaklist()
r = weakref.ref(l)
8 loại bỏ hiệu quả đối tượng.

Đã trả lời ngày 1 tháng 6 năm 2019 lúc 13:50Jun 1, 2019 at 13:50

Hướng dẫn what is a weak reference python - Python tham chiếu yếu là gì

tuyến tiền liệtprosti

38.2k11 Huy hiệu vàng169 Huy hiệu bạc144 Huy hiệu đồng11 gold badges169 silver badges144 bronze badges

Tài liệu tham khảo yếu được sử dụng để làm gì?

Một tham chiếu yếu cho phép người 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. Một tham chiếu yếu chỉ có giá trị trong khoảng thời gian không xác định cho đến khi đối tượng được thu thập khi không có tài liệu tham khảo mạnh nào tồn tại.permits the garbage collector to collect the object while still allowing the application to access the object. A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist.

Tài liệu tham khảo mạnh và yếu là gì?

Một tài liệu tham khảo yếu chỉ là một con trỏ đến một đối tượng không bảo vệ đối tượng khỏi bị ARC giải quyết.Trong khi các tài liệu tham khảo mạnh mẽ làm tăng số lượng giữ lại của một đối tượng lên 1, các tài liệu tham khảo yếu thì không.Ngoài ra, các tài liệu tham khảo yếu không thoát khỏi con trỏ đến đối tượng của bạn khi nó xử lý thành công.strong references increase the retain count of an object by 1, weak references do not. In addition, weak references zero out the pointer to your object when it successfully deallocates.

Các tài liệu tham khảo yếu được thực hiện như thế nào?

Khi một tham chiếu yếu A được tạo ra một đối tượng B, sẽ có một mục trong Hashtable REVENTADED hoặc được tạo, có chìa khóa sẽ là con trỏ tới B. "Dirty" - để lưu trữ giá trị băm đặc biệt với mỗi đối tượng, sẽđược không khi đối tượng bị phá hủy.. "Dirty" - to store a special hash-value with each object, which would be zeroed when the object is destroyed.

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

__weakref__ chỉ là một đối tượng mờ đục tham khảo tất cả các tham chiếu yếu đến đối tượng hiện tại.Trên thực tế, đây là một ví dụ của yếu (hoặc đôi khi yếu), vừa là một tham chiếu yếu đến đối tượng và một phần của danh sách được liên kết gấp đôi cho tất cả các tài liệu tham khảo yếu cho đối tượng đó.an opaque object that references all the weak references to the current object. In actual fact it's an instance of weakref (or sometimes weakproxy ) which is both a weak reference to the object and part of a doubly linked list to all weak references for that object.