来自文档:
Weakref.proxy为使用弱引用的对象返回一个代理。但如果我运行以下代码:obj = SomeObj()
obj # <__main__.ExpensiveObject at 0xbfc5390>
p = weakref.proxy(obj)
r = weakref.ref(obj)
r() # <__main__.ExpensiveObject at 0xbfc5390>
# the weakreference gives me the same object as expected
p # <__main__.ExpensiveObject at 0xc456098>
# the proxy refers to a different object, why is that?
任何帮助都将不胜感激!谢谢
您使用的是IPython,它有自己漂亮的打印设施。默认的漂亮打印机更喜欢通过__class__
而不是type
:检查对象的类
def _default_pprint(obj, p, cycle):
"""
The default print function. Used if an object does not provide one and
it's none of the builtin objects.
"""
klass = _safe_getattr(obj, '__class__', None) or type(obj)
if _safe_getattr(klass, '__repr__', None) is not object.__repr__:
# A user-provided repr. Find newlines and replace them with p.break_()
_repr_pprint(obj, p, cycle)
return
p.begin_group(1, '<')
p.pretty(klass)
...
但是weakref.proxy
对象通过__class__
与它们的类有关,所以漂亮的打印机认为代理实际上是ExpensiveObject
的一个实例。它看不到代理的__repr__
,并将类打印为ExpensiveObject
而不是weakproxy
。
有些奇怪,因为我无法重现您的问题:
>>> import weakref
>>> class Foo: pass
...
>>> f = Foo()
>>> f
<__main__.Foo object at 0x7f40c44f63c8>
>>> p = weakref.proxy(f)
>>> p
<weakproxy at 0x7f40c44f9a98 to Foo at 0x7f40c44f63c8>
>>> r = weakref.ref(f)
>>> r
<weakref at 0x7f40c4502278; to 'Foo' at 0x7f40c44f63c8>
>>> r()
<__main__.Foo object at 0x7f40c44f63c8>
这段代码是在一个新的解释器实例中输入的。输出与您的非常不同!您使用的是哪种版本的python?