通过代理类调用类返回相同的对象

时间:2014-05-23 21:58:11

标签: oop python-2.7 magic-methods

为什么通过代理类调用类会返回相同的对象?

编辑:   我调用两个不同的属性,但两个不同的对象的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是如何相同的?

1 个答案:

答案 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".