为什么方法包含对实例/类的强引用?

时间:2014-08-28 03:09:57

标签: python python-2.7 methods

如果你在python中检查一个方法,你会发现im_class& im_self个属性。如果你仔细观察,你会发现这些都是强烈的参考!

也许我独自一人;但是我想的方式,如果方法本身依赖于它们各自的类/实例(即self参数),那么该方法应该“随船运行”,不是吗?为什么作者会选择在方法对象中存储强引用而不是弱引用?这会强制要避免使用循环引用的用户使用workarounds。有没有人有任何强烈引用类/实例的用例?

示例:

from weakref import proxy

class Foo(object):
    def func(self):
        pass

>>> foo = Foo()
>>> func = foo.func
>>> _foo = proxy(foo)
>>> func.im_self is _foo
False

1 个答案:

答案 0 :(得分:0)

仅适用于方法包装器,它们绑定到类的特定实例。使用强大的参考避免了有趣的惊喜;例如,对于课程Xfunc = X().foo; func()执行您期望的内容(使用弱引用,X()将被删除,随后的func()调用将会意外失败)。

如果你想拥有"弱引用方法",最简单的方法就是传递(类方法,弱实例)的元组,例如: (X.foo, weakref.ref(x))代替x.foo