从python中的weakref代理获取常规引用

时间:2013-10-27 17:24:42

标签: python weak-references

有没有办法为我得到弱代理代理的对象获得正确的引用?

我已经浏览了weakref模块的文档,并且没有在那里得到答案,或者通过手动调用weakproxy对象。

3 个答案:

答案 0 :(得分:3)

尽管没有直接暴露在代理对象本身上的内容,但是可以通过滥用绑定方法的__self__属性来获得引用:

obj_ref = proxy.__repr__.__self__

这里使用__repr__只是一个随机选择,尽管如果要使用通用方法,最好使用所有对象都应该具有的方法。

答案 1 :(得分:1)

你可以通过调用它从弱反对象获取引用:

obj = ref()

来自weakref docs

  

弱引用对象没有属性或方法,但允许使用   如果它仍然存在,则通过调用它来获得所指对象。如果指示物不再存在,   调用引用对象返回None

虽然这对代理对象不起作用,但我没有看到从weakref代理获取弱引用对象或对实际对象的引用的方法。

答案 2 :(得分:0)

我不知道您所说的正确参考是什么意思,但根据: https://pymotw.com/2/weakref/,

您可以像使用原始对象一样使用代理。

import weakref

class ExpensiveObject(object):
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print '(Deleting %s)' % self

obj = ExpensiveObject('My Object')
r = weakref.ref(obj)
p = weakref.proxy(obj)

print 'via obj:', obj.name
print 'via ref:', r().name
print 'via proxy:', p.name
del obj
print 'via proxy:', p.name

这与使用weakref.ref形成对比,在那里你必须调用,即使用()-operator on,弱引用来获取原始对象。