weakref 模块的 Python 2.7 文档是这样说的:
不是所有的对象都可以被弱引用;那些可以包含类实例、用 Python(但不是 C)编写的函数、方法(绑定和未绑定)的对象,...
弱引用模块的 Python 3.3 文档这样说:
不是所有的对象都可以被弱引用;那些可以包含类实例的对象,用 Python(但不是 C)编写的函数,实例方法,......
对我来说,这些表明对绑定方法的弱引用(在所有版本的 Python 2.7 - 3.3 中)应该很好,而对未绑定方法的弱引用在 Python 2.7 中应该很好。
然而在 Python 2.7 中,为方法(绑定或未绑定)创建弱引用会导致死弱引用:
>>> def isDead(wr): print 'dead!'
...
>>> class Foo:
... def bar(self): pass
...
>>> wr=weakref.ref(Foo.bar, isDead)
dead!
>>> wr() is None
True
>>> foo=Foo()
>>> wr=weakref.ref(foo.bar, isDead)
dead!
>>> wr() is None
True
不是我根据文档所期望的。
类似地,在 Python 3.3 中,绑定方法的弱引用在创建时终止:
>>> wr=weakref.ref(Foo.bar, isDead)
>>> wr() is None
False
>>> foo=Foo()
>>> wr=weakref.ref(foo.bar, isDead)
dead!
>>> wr() is None
True
再次不是我根据文档所期望的。
由于这个措辞自 2.7 以来一直存在,这肯定不是疏忽。谁能解释这些陈述和观察到的行为实际上并不矛盾?
编辑/澄清:换句话说,3.3 的声明说“实例方法可以被弱引用”;这是否意味着可以合理地预期weakref.ref(an instance method)() 不是None?如果是None,那么“实例方法”不应该列在可以被弱引用的对象类型中吗?