gpt4 book ai didi

python - 为什么我的 weakrefs 在指向一个方法时死在水中?

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:01 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Why doesn't the weakref work on this bound method?

我在观察者模式中使用 weakrefs 并注意到一个有趣的现象。如果我创建一个对象并将其中一个方法添加为 Observable 的观察者,则该引用几乎立即失效。谁能解释发生了什么?

我也很想知道为什么这可能是个坏主意。我决定不使用 weakrefs 并确保使用 Observable.removeobserver 正确清理自己,但我的好奇心在这里扼杀了我。

代码如下:

from weakref import ref
class Observable:
__observers = None
def addobserver(self, observer):
if not self.__observers:
self.__observers = []
self.__observers.append(ref(observer))
print 'ADDING observer', ref(observer)

def removeobserver(self, observer):
self.__observers.remove(ref(observer))

def notify(self, event):
for o in self.__observers:
if o() is None:
print 'observer was deleted (removing)', o
self.__observers.remove(o)
else:
o()(event)

class C(Observable):
def set(self, val):
self.notify(val)

class bar(object):
def __init__(self):
self.c = C()
self.c.addobserver(self.foo)
print self.c._Observable__observers

def foo(self, x):
print 'callback', x #never reached

b = bar()
b.c.set(3)

这是输出:

ADDING observer <weakref at 0xaf1570; to 'instancemethod' at 0xa106c0 (foo)>
[<weakref at 0xaf1570; dead>]
observer was deleted (removing) <weakref at 0xaf1570; dead>

主要要注意的是调用addobserver后的打印语句显示weakref已经死了。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com