为什么通过代理类调用类会返回相同的对象?
编辑: 我调用两个不同的属性,但两个不同的对象的id如何相同?
class A(object):
def __init__(self):
print "In Init"
self.a = 40
def __getattr__(self, attr):
if attr in ["b", "c"]:
return 42
raise AttributeError("%r object has no attribute %r" % (self.__class__, attr))
class Proxy(object):
def __get__(self, instance, type=None, *args, **kwargs):
return A()
class C(object):
tran = Proxy()
class D(C):
def sample(self):
x = id(self.tran)
y = id(self.tran)
print x == y
d = D()
d.sample()
每当访问tran时,它返回相同的对象以及x和y的id是如何相同的?
答案 0 :(得分:1)
我非常确定您遇到的问题是因为您只保存了id
您正在获得的对象。在CPython中,id
是对象的内存地址。如果对象没有引用(如id
调用结束后的情况那样),它将被释放,其内存地址可能被不同的对象重用。
尝试保留对返回的实际对象的引用,稍后再调用id
。这将确保您的两个对象同时处于活动状态,这意味着它们将具有不同的id
:
def sample(self):
x = self.tran # don't call id yet!
y = self.tran # we need to keep references to these objects
print id(x) == id(y) # This will print False. You could also test "x is y".