2009-12-09 57 views
6

我在创建类的实例来测试它们的函数内部运行for循环。而不是创造新的课程,它似乎一遍又一遍地重复使用相同的两个课程。为什么python重用函数里面的类实例

有没有什么我想知道如何在python方法中处理类和变量?

我怎么能生成循环

class CollectionSetImages(unittest.TestCase): 
    def test_keywordset(self): 
     """Testing keyword queries by images equality """ 

     for keyword in ['a','b','c','d','e','f','g']: 
      images_by_keyword = Image.keyword_query([keyword]) 
      collection = Collection([keyword]) 
      class_images = collection.images 
      print('colleciton: %s id: %s' % (collection,id(collection))) 
      self.assertEqual(images_by_keyword, class_images,) 

这里的每个迭代一个新的对象是输出

colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 

当我使用单独的变量名,我得到的每个实例单独的ID作为预期:

collectionA = Collection(['a']) 
print('collection: %s id: %s' % (collectionA,id(collectionA))) 

collectionB = Collection(['f']) 
print('collection: %s id: %s' % (collectionB,id(collectionB))) 

collectionC = Collection(['f']) 
print('collection: %s id: %s' % (collectionC,id(collectionC))) 

输出:

collection: <tests.fakeimages._FakeCollection object at 0xb7cbc8ac> id: 3083585708 
collection: <tests.fakeimages._FakeCollection object at 0xb7cbccec> id: 3083586796 
collection: <tests.fakeimages._FakeCollection object at 0xb7cbcd2c> id: 3083586860 
+1

看起来你已经有了一个测试模拟对象......你可能希望仔细检查你的模拟类的实例如何在测试用例中发挥作用。 – 2009-12-09 21:15:43

+0

@Jarret,很好,发布测试对象的输出很快 – 2009-12-09 21:19:15

回答

11

所有显示的是对象的内存正在被重用,而不是新的对象没有被实例化。在每次迭代中,collection正在被覆盖,因此前一个对象的引用计数会下降,并且Python解释器可以自由释放其内存并重用它(用于下一个对象)。

>>> for a in range(1,5): 
...  b = object() 
...  print b, id(b) 
... 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9470> 3084620912 

在这种情况下,2个内存位置正在被重新使用。如果你将它添加到列表(或保存在其他地方),将它保存下来:

>>> a = [] 
>>> for b in range(1,5): 
...  c = object() 
...  a.append(c) 
...  print c, id(c) 
... 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9478> 3084620920 
<object object at 0xb7db9480> 3084620928 
3

从Python文档:

ID() 返回一个对象的“身份”。这是一个整数(或长整数),在整个生命周期中保证这个对象是唯一的并且是常量。具有非重叠生命周期的两个对象可能具有相同的id()值。

+0

非常好,谢谢你挖掘这个 – 2009-12-11 15:52:42

相关问题