<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](types.xhtml "types --- Dynamic type creation and names for built-in types") | - [上一頁](array.xhtml "array --- Efficient arrays of numeric values") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 標準庫](index.xhtml) ? - [數據類型](datatypes.xhtml) ? - $('.inline-search').show(0); | # [`weakref`](#module-weakref "weakref: Support for weak references and weak dictionaries.") --- 弱引用 **源碼:** [Lib/weakref.py](https://github.com/python/cpython/tree/3.7/Lib/weakref.py) \[https://github.com/python/cpython/tree/3.7/Lib/weakref.py\] - - - - - - [`weakref`](#module-weakref "weakref: Support for weak references and weak dictionaries.") 模塊允許Python程序員創建對象的 *weak references* 。 在下文中,術語 *referent* 表示由弱引用引用的對象。 對對象的弱引用不能保證對象存活:當對像的引用只剩弱引用時, [garbage collection](../glossary.xhtml#term-garbage-collection) 可以銷毀引用并將其內存重用于其他內容。但是,在實際銷毀對象之前,即使沒有強引用,弱引用也一直能返回該對象。 弱引用的主要用途是實現保存大對象的高速緩存或映射,但又并希望大對象僅僅因為它出現在高速緩存或映射中而保持存活。 例如,如果您有許多大型二進制圖像對象,則可能希望將名稱與每個對象關聯起來。如果您使用Python字典將名稱映射到圖像,或將圖像映射到名稱,則圖像對象將保持活動狀態,因為它們在字典中顯示為值或鍵。 [`weakref`](#module-weakref "weakref: Support for weak references and weak dictionaries.") 模塊提供的 [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") 和 [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") 類可以替代Python字典,使用弱引用來構造映射,這些映射不會僅僅因為它們出現在映射對象中而使對象保持存活。例如,如果一個圖像對象是 [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") 中的值,那么當對該圖像對象的剩余引用是弱映射對象所持有的弱引用時,垃圾回收可以回收該對象并將其在弱映射對象中相應的條目刪除。 [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") 和 [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") 在它們的實現中使用弱引用,在弱引用上設置回調函數,當鍵或值被垃圾回收回收時通知弱字典。 [`WeakSet`](#weakref.WeakSet "weakref.WeakSet") 實現了 [`set`](stdtypes.xhtml#set "set") 接口,但像 [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") 一樣,只持有其元素的弱引用。` [`finalize`](#weakref.finalize "weakref.finalize") 提供了注冊一個對象被垃圾收集時要調用的清理函數的方式。這比在原始弱引用上設置回調函數更簡單,因為模塊會自動確保對象被回收前終結器一直保持存活。 這些弱容器類型之一或者 [`finalize`](#weakref.finalize "weakref.finalize") 就是大多數程序所需要的 - 通常不需要直接創建自己的弱引用。[`weakref`](#module-weakref "weakref: Support for weak references and weak dictionaries.") 模塊暴露了低級機制,以便于高級用途。 并非所有對象都可以被弱引用;那些可以包含類實例的對象,用 Python 編寫的函數(不是用C語言編寫的),實例方法,集合,frozensets,某些 [文件對象](../glossary.xhtml#term-file-object) , [generator](../glossary.xhtml#term-generator),type 對象,套接字,數組,雙端隊列,正則表達式模式對象和代碼對象。 在 3.2 版更改: 添加了對thread.lock,threading.Lock和代碼對象的支持。 幾個內建類型如 [`list`](stdtypes.xhtml#list "list") 和 [`dict`](stdtypes.xhtml#dict "dict") 不直接支持弱引用,但可以通過子類化添加支持: ``` class Dict(dict): pass obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable ``` 其他內建類型如 [`tuple`](stdtypes.xhtml#tuple "tuple") 和 [`int`](functions.xhtml#int "int") 即使在子類化時也不支持弱引用(這是一個實現細節,在各種Python實現中可能不同)。 Extension types can easily be made to support weak references; see [Weak Reference Support](../extending/newtypes.xhtml#weakref-support). *class* `weakref.``ref`(*object*\[, *callback*\])返回對 *對象* 的弱引用。如果原始對象仍然存活,則可以通過調用引用對象來檢索原始對象;如果引用的原始對象不再存在,則調用引用對象將得到 [`None`](constants.xhtml#None "None") 。如果提供了 *回調* 而且值不是 [`None`](constants.xhtml#None "None") ,并且返回的弱引用對象仍然存活,則在對象即將終結時將調用回調;弱引用對象將作為回調的唯一參數傳遞;指示物將不再可用。 It is allowable for many weak references to be constructed for the same object. Callbacks registered for each weak reference will be called from the most recently registered callback to the oldest registered callback. Exceptions raised by the callback will be noted on the standard error output, but cannot be propagated; they are handled in exactly the same way as exceptions raised from an object's [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") method. Weak references are [hashable](../glossary.xhtml#term-hashable) if the *object* is hashable. They will maintain their hash value even after the *object* was deleted. If [`hash()`](functions.xhtml#hash "hash") is called the first time only after the *object* was deleted, the call will raise [`TypeError`](exceptions.xhtml#TypeError "TypeError"). Weak references support tests for equality, but not ordering. If the referents are still alive, two references have the same equality relationship as their referents (regardless of the *callback*). If either referent has been deleted, the references are equal only if the reference objects are the same object. This is a subclassable type rather than a factory function. `__callback__`This read-only attribute returns the callback currently associated to the weakref. If there is no callback or if the referent of the weakref is no longer alive then this attribute will have value `None`. 在 3.4 版更改: Added the [`__callback__`](#weakref.ref.__callback__ "weakref.ref.__callback__") attribute. `weakref.``proxy`(*object*\[, *callback*\])Return a proxy to *object* which uses a weak reference. This supports use of the proxy in most contexts instead of requiring the explicit dereferencing used with weak reference objects. The returned object will have a type of either `ProxyType` or `CallableProxyType`, depending on whether *object* is callable. Proxy objects are not [hashable](../glossary.xhtml#term-hashable) regardless of the referent; this avoids a number of problems related to their fundamentally mutable nature, and prevent their use as dictionary keys. *callback* is the same as the parameter of the same name to the [`ref()`](#weakref.ref "weakref.ref") function. `weakref.``getweakrefcount`(*object*)Return the number of weak references and proxies which refer to *object*. `weakref.``getweakrefs`(*object*)Return a list of all weak reference and proxy objects which refer to *object*. *class* `weakref.``WeakKeyDictionary`(\[*dict*\])Mapping class that references keys weakly. Entries in the dictionary will be discarded when there is no longer a strong reference to the key. This can be used to associate additional data with an object owned by other parts of an application without adding attributes to those objects. This can be especially useful with objects that override attribute accesses. 注解 Caution: Because a [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") is built on top of a Python dictionary, it must not change size when iterating over it. This can be difficult to ensure for a [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") because actions performed by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary") objects have an additional method that exposes the internal references directly. The references are not guaranteed to be "live" at the time they are used, so the result of calling the references needs to be checked before being used. This can be used to avoid creating references that will cause the garbage collector to keep the keys around longer than needed. `WeakKeyDictionary.``keyrefs`()Return an iterable of the weak references to the keys. *class* `weakref.``WeakValueDictionary`(\[*dict*\])Mapping class that references values weakly. Entries in the dictionary will be discarded when no strong reference to the value exists any more. 注解 Caution: Because a [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") is built on top of a Python dictionary, it must not change size when iterating over it. This can be difficult to ensure for a [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") because actions performed by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") objects have an additional method that has the same issues as the `keyrefs()` method of [`WeakKeyDictionary`](#weakref.WeakKeyDictionary "weakref.WeakKeyDictionary")objects. `WeakValueDictionary.``valuerefs`()Return an iterable of the weak references to the values. *class* `weakref.``WeakSet`(\[*elements*\])Set class that keeps weak references to its elements. An element will be discarded when no strong reference to it exists any more. *class* `weakref.``WeakMethod`(*method*)A custom [`ref`](#weakref.ref "weakref.ref") subclass which simulates a weak reference to a bound method (i.e., a method defined on a class and looked up on an instance). Since a bound method is ephemeral, a standard weak reference cannot keep hold of it. [`WeakMethod`](#weakref.WeakMethod "weakref.WeakMethod") has special code to recreate the bound method until either the object or the original function dies: ``` >>> class C: ... def method(self): ... print("method called!") ... >>> c = C() >>> r = weakref.ref(c.method) >>> r() >>> r = weakref.WeakMethod(c.method) >>> r() <bound method C.method of <__main__.C object at 0x7fc859830220>> >>> r()() method called! >>> del c >>> gc.collect() 0 >>> r() >>> ``` 3\.4 新版功能. *class* `weakref.``finalize`(*obj*, *func*, *\*args*, *\*\*kwargs*)Return a callable finalizer object which will be called when *obj*is garbage collected. Unlike an ordinary weak reference, a finalizer will always survive until the reference object is collected, greatly simplifying lifecycle management. A finalizer is considered *alive* until it is called (either explicitly or at garbage collection), and after that it is *dead*. Calling a live finalizer returns the result of evaluating `func(*arg, **kwargs)`, whereas calling a dead finalizer returns [`None`](constants.xhtml#None "None"). Exceptions raised by finalizer callbacks during garbage collection will be shown on the standard error output, but cannot be propagated. They are handled in the same way as exceptions raised from an object's [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") method or a weak reference's callback. When the program exits, each remaining live finalizer is called unless its [`atexit`](atexit.xhtml#module-atexit "atexit: Register and execute cleanup functions.") attribute has been set to false. They are called in reverse order of creation. A finalizer will never invoke its callback during the later part of the [interpreter shutdown](../glossary.xhtml#term-interpreter-shutdown) when module globals are liable to have been replaced by [`None`](constants.xhtml#None "None"). `__call__`()If *self* is alive then mark it as dead and return the result of calling `func(*args, **kwargs)`. If *self* is dead then return [`None`](constants.xhtml#None "None"). `detach`()If *self* is alive then mark it as dead and return the tuple `(obj, func, args, kwargs)`. If *self* is dead then return [`None`](constants.xhtml#None "None"). `peek`()If *self* is alive then return the tuple ``` (obj, func, args, kwargs) ``` . If *self* is dead then return [`None`](constants.xhtml#None "None"). `alive`Property which is true if the finalizer is alive, false otherwise. `atexit`A writable boolean property which by default is true. When the program exits, it calls all remaining live finalizers for which [`atexit`](#weakref.finalize.atexit "weakref.finalize.atexit") is true. They are called in reverse order of creation. 注解 It is important to ensure that *func*, *args* and *kwargs* do not own any references to *obj*, either directly or indirectly, since otherwise *obj* will never be garbage collected. In particular, *func* should not be a bound method of *obj*. 3\.4 新版功能. `weakref.``ReferenceType`The type object for weak references objects. `weakref.``ProxyType`The type object for proxies of objects which are not callable. `weakref.``CallableProxyType`The type object for proxies of callable objects. `weakref.``ProxyTypes`Sequence containing all the type objects for proxies. This can make it simpler to test if an object is a proxy without being dependent on naming both proxy types. *exception* `weakref.``ReferenceError`Exception raised when a proxy object is used but the underlying object has been collected. This is the same as the standard [`ReferenceError`](exceptions.xhtml#ReferenceError "ReferenceError") exception. 參見 [**PEP 205**](https://www.python.org/dev/peps/pep-0205) \[https://www.python.org/dev/peps/pep-0205\] - Weak ReferencesThe proposal and rationale for this feature, including links to earlier implementations and information about similar features in other languages. ## 弱引用對象 Weak reference objects have no methods and no attributes besides [`ref.__callback__`](#weakref.ref.__callback__ "weakref.ref.__callback__"). A weak reference object allows the referent to be obtained, if it still exists, by calling it: ``` >>> import weakref >>> class Object: ... pass ... >>> o = Object() >>> r = weakref.ref(o) >>> o2 = r() >>> o is o2 True ``` If the referent no longer exists, calling the reference object returns [`None`](constants.xhtml#None "None"): ``` >>> del o, o2 >>> print(r()) None ``` Testing that a weak reference object is still live should be done using the expression `ref() is not None`. Normally, application code that needs to use a reference object should follow this pattern: ``` # r is a weak reference object o = r() if o is None: # referent has been garbage collected print("Object has been deallocated; can't frobnicate.") else: print("Object is still live!") o.do_something_useful() ``` Using a separate test for "liveness" creates race conditions in threaded applications; another thread can cause a weak reference to become invalidated before the weak reference is called; the idiom shown above is safe in threaded applications as well as single-threaded applications. Specialized versions of [`ref`](#weakref.ref "weakref.ref") objects can be created through subclassing. This is used in the implementation of the [`WeakValueDictionary`](#weakref.WeakValueDictionary "weakref.WeakValueDictionary") to reduce the memory overhead for each entry in the mapping. This may be most useful to associate additional information with a reference, but could also be used to insert additional processing on calls to retrieve the referent. This example shows how a subclass of [`ref`](#weakref.ref "weakref.ref") can be used to store additional information about an object and affect the value that's returned when the referent is accessed: ``` import weakref class ExtendedRef(weakref.ref): def __init__(self, ob, callback=None, **annotations): super(ExtendedRef, self).__init__(ob, callback) self.__counter = 0 for k, v in annotations.items(): setattr(self, k, v) def __call__(self): """Return a pair containing the referent and the number of times the reference has been called. """ ob = super(ExtendedRef, self).__call__() if ob is not None: self.__counter += 1 ob = (ob, self.__counter) return ob ``` ## 示例 This simple example shows how an application can use object IDs to retrieve objects that it has seen before. The IDs of the objects can then be used in other data structures without forcing the objects to remain alive, but the objects can still be retrieved by ID if they do. ``` import weakref _id2obj_dict = weakref.WeakValueDictionary() def remember(obj): oid = id(obj) _id2obj_dict[oid] = obj return oid def id2obj(oid): return _id2obj_dict[oid] ``` ## Finalizer Objects The main benefit of using [`finalize`](#weakref.finalize "weakref.finalize") is that it makes it simple to register a callback without needing to preserve the returned finalizer object. For instance ``` >>> import weakref >>> class Object: ... pass ... >>> kenny = Object() >>> weakref.finalize(kenny, print, "You killed Kenny!") #doctest:+ELLIPSIS <finalize object at ...; for 'Object' at ...> >>> del kenny You killed Kenny! ``` The finalizer can be called directly as well. However the finalizer will invoke the callback at most once. ``` >>> def callback(x, y, z): ... print("CALLBACK") ... return x + y + z ... >>> obj = Object() >>> f = weakref.finalize(obj, callback, 1, 2, z=3) >>> assert f.alive >>> assert f() == 6 CALLBACK >>> assert not f.alive >>> f() # callback not called because finalizer dead >>> del obj # callback not called because finalizer dead ``` You can unregister a finalizer using its [`detach()`](#weakref.finalize.detach "weakref.finalize.detach")method. This kills the finalizer and returns the arguments passed to the constructor when it was created. ``` >>> obj = Object() >>> f = weakref.finalize(obj, callback, 1, 2, z=3) >>> f.detach() #doctest:+ELLIPSIS (<...Object object ...>, <function callback ...>, (1, 2), {'z': 3}) >>> newobj, func, args, kwargs = _ >>> assert not f.alive >>> assert newobj is obj >>> assert func(*args, **kwargs) == 6 CALLBACK ``` Unless you set the [`atexit`](#weakref.finalize.atexit "weakref.finalize.atexit") attribute to [`False`](constants.xhtml#False "False"), a finalizer will be called when the program exits if it is still alive. For instance ``` >>> obj = Object() >>> weakref.finalize(obj, print, "obj dead or exiting") <finalize object at ...; for 'Object' at ...> >>> exit() obj dead or exiting ``` ## Comparing finalizers with [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") methods Suppose we want to create a class whose instances represent temporary directories. The directories should be deleted with their contents when the first of the following events occurs: - the object is garbage collected, - the object's `remove()` method is called, or - the program exits. We might try to implement the class using a [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") method as follows: ``` class TempDir: def __init__(self): self.name = tempfile.mkdtemp() def remove(self): if self.name is not None: shutil.rmtree(self.name) self.name = None @property def removed(self): return self.name is None def __del__(self): self.remove() ``` Starting with Python 3.4, [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") methods no longer prevent reference cycles from being garbage collected, and module globals are no longer forced to [`None`](constants.xhtml#None "None") during [interpreter shutdown](../glossary.xhtml#term-interpreter-shutdown). So this code should work without any issues on CPython. However, handling of [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") methods is notoriously implementation specific, since it depends on internal details of the interpreter's garbage collector implementation. A more robust alternative can be to define a finalizer which only references the specific functions and objects that it needs, rather than having access to the full state of the object: ``` class TempDir: def __init__(self): self.name = tempfile.mkdtemp() self._finalizer = weakref.finalize(self, shutil.rmtree, self.name) def remove(self): self._finalizer() @property def removed(self): return not self._finalizer.alive ``` Defined like this, our finalizer only receives a reference to the details it needs to clean up the directory appropriately. If the object never gets garbage collected the finalizer will still be called at exit. The other advantage of weakref based finalizers is that they can be used to register finalizers for classes where the definition is controlled by a third party, such as running code when a module is unloaded: ``` import weakref, sys def unloading_module(): # implicit reference to the module globals from the function body weakref.finalize(sys.modules[__name__], unloading_module) ``` 注解 If you create a finalizer object in a daemonic thread just as the program exits then there is the possibility that the finalizer does not get called at exit. However, in a daemonic thread [`atexit.register()`](atexit.xhtml#atexit.register "atexit.register"), `try: ... finally: ...` and `with: ...`do not guarantee that cleanup occurs either. ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](types.xhtml "types --- Dynamic type creation and names for built-in types") | - [上一頁](array.xhtml "array --- Efficient arrays of numeric values") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 標準庫](index.xhtml) ? - [數據類型](datatypes.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看