- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一些遵循以下原则的东西:
from weakref import WeakValueDictionary
class Container(object):
def __init__(self):
self.dic = WeakValueDictionary({})
def put_in(self, something):
self.dic[something] = Thing(self, something)
class Thing(object):
def __init__(self, container, name):
self.container = container
self.name = name
def what_I_am(self):
print("I am a thing called {}".format(self.name))
pot = Container()
pot.put_in('foo')
pot.dic['foo'].what_I_am()
但我明白:
File "C:/Users/jacques/ownCloud/dev/weakref.py", line 26, in <module>
pot.dic['foo'].what_I_am()
File "C:\Program Files\Anaconda3\lib\weakref.py", line 131, in __getitem__
o = self.data[key]()
KeyError: 'foo'
我知道我的实现不正确,因为 Thing
实例被 GC 并从 WeakValueDictionary
中删除。
有什么方法可以实现类似的目的,以防止 Container
和 Thing
之间的循环引用?
编辑:如果我将上面的代码更改为下面的代码,是否可以解决循环引用问题?
from weakref import proxy
class Container(dict):
def put_in(self, something):
self[something] = Thing(self)
class Thing(object):
def __init__(self, container):
self.container = proxy(container)
def what_is_it(self):
print("I am a thing called {}".format(self))
def __getattr__(self, name):
try: #Look up the Thing instance first
return object.__getattribute__(self, name)
except AttributeError: #Try to find the attribute in container
return self.container.__getattribute__(name)
def __format__(self, spec):
(name,) = (key for key, val in self.container.items() if self == val)
return name
pot = Container()
pot.location = 'Living room'
pot.put_in('foo')
pot['foo'].what_is_it()
print(pot['foo'].location)
最佳答案
WeakValueDictionary
的关键在于,一旦对象不再使用,它的键就会自动删除。
紧接着
self.dic[thing] = Thing(self)
在 WeakValueDictionary
之外不再有对 Thing
对象的引用,因此您看到的行为是正确且符合预期的。
如果您希望 key 可访问,请将 WeakValueDictionary
替换为常规 dict
。或者,确保存在对该事物的引用,例如通过返回它或在其他地方引用它。
关于python - 两个对象之间的循环引用是否需要使用weakref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055383/
来自 documentation : Weakref.proxy returns a proxy to object which uses a weak reference. But if I run
我正在查看 Ruby WeakRef,似乎 API 的编写方式具有隐含的竞争条件,尽管它似乎不太可能命中。 API 隐含的基本用法是: obj = Object.new foo = WeakRef.n
我通过以下方式使用 Py2neo 创建关系: article = graph.merge_one("Article", "id", aid) article2 = graph.merge_one("A
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why doesn't the weakref work on this bound method? 我在观
我尝试在我的类上使用弱引用,我在其中使用插槽来节省一些内存,但我无法创建派生类。 class A(object): __slots__ = ['__weakref__'] class B(A)
我有两个类:父类和容器类。父类实例有匹配的容器类实例作为弱引用。 深度复制父实例时出现问题,weakref 仍然链接到原始实例。这是一个最小的例子: import weakref from copy
我知道在 Python 中我可以做如下的事情: from weakref import ref class A(object): def __init__(self, parent):
我想允许重新定义已在头文件中定义的 .c 文件中的函数。根据关于 weakref 属性的 GCC 手册: The effect is equivalent to moving all referenc
我在玩 ruby 终结器时发现了一些对我来说很奇怪的行为。我可以将触发代码减少为以下内容: require "weakref" class Foo def initialize
我想删除索引在列表["A", "C"]中的行。 例子: import pandas as pd df_test = pd.DataFrame({"Col": [1,2,3,4]}, index=["A
这里的多处理相当新。我有一个运行两个进程的代码。一种是不断地从服务器接收数据块并将其放入队列中,另一种是从队列中取出数据块并对其进行处理。 下面是我的客户端代码: import socket impo
我有一个类(我不控制)没有实现自己的清理。我认为这是 weakref.finalize 适用的情况之一,但我无法让它工作。 def cleanup(obj): print('Cleanup o
有没有比以下更好的方法: def create_expired_weakref(): class Tmp: pass ref = weakref.ref(Tmp()) asse
在 Python 中,有没有办法在对象完成后调用函数? 我认为 weakref 中的回调会执行此操作,但似乎一旦对象被垃圾回收,但在调用对象 __del__ 方法之前调用 weakref 的回调。这似
我想知道使用 WeakRef 的开销是多少?处理大数据集? 我要执行的任务是这样的: huge = get_array_of_weak_refs # 100000000 entries or more
是否有任何障碍阻止weakref从做 __del__ 所做的所有事情,但有更强的保证(例如,finalize 保证调用将在解释器退出之前进行,并且调用的顺序是明确定义的等)? 似乎在遥远的过去it w
我遇到过这个 WeakRef polyfill:ungap / weakrefs . 我很难理解它是如何工作的,尤其是第 11-14 行: var wr = new WeakMap; function
我想同时训练多个神经网络,我正在尝试使用 multiprocessing 模块,以便每个网络都可以在单独的过程中进行训练,但我遇到了一个问题.当我运行下面的演示代码时(由于 apply_async 函
在尝试使用 WeakReferences 的一些示例时,我遇到了以下情况。我正在创建一个 hashmap 并用 Employee 对象的弱引用填充它。现在我有两个强引用, employee 和 w
使用 Boost.Python,有没有办法调用通过 weakref 传递的 Python 函数?以下代码不起作用: import weakref def foo(): print 'it wo
我是一名优秀的程序员,十分优秀!