2009-12-09 22 views
6

Test için bir sınıfın örneklerini oluşturan bir işlev içinde for döngüsü çalıştırıyorum. Yeni sınıflar yapmak yerine, aynı ikiyi tekrar tekrar kullanıyor gibi görünüyor.python neden işlev içinde bir sınıf örneğini yeniden kullanıyor

Sınıflar ve değişkenlerin python yöntemlerinde nasıl ele alındığı konusunda eksik olan bir şey var mı? beklendiği gibi ben her örneği için ayrı kimlikleri olsun ayrı değişken adları kullandığımda döngü burada

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,) 

her okunması için yeni bir nesne oluşturmak nasıl

çıkış

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 

olduğunu :

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))) 

çıkışlar:

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

Orada bir deneme nesnesi nesnesi var gibi görünüyor ... sen deneme durumunda mock sınıfının örnekleme nasıl devreye gireceğini çift kontrol etmek isteyebilirsiniz. –

+0

@Jarret, iyi bir nokta, test nesnelerini çıktısını kısa bir süre içinde göndererek –

cevap

11

Tüm bu gösteriler, nesnelerin belleğinin yeniden kullanılmadığı değil, yeni nesnelerin oluşturulmadığıdır. Her yinelemede collection'un üzerine yazıldığından, önceki nesnenin referans sayısı düşer ve Python yorumlayıcısı belleği boşaltarak yeniden kullanabilir (bir sonraki nesne için).

>>> 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 

Bu durumda, 2 bellek konumu yeniden kullanılıyor. Eğer bir listeye eklemek (veya başka bir yere kaydetmek) için olsaydı, korunacak:

>>> 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

piton belgelerinden:

id(), bir nesnenin “kimliğini” Return . Bu, ömrü boyunca bu nesne için benzersiz ve sabit olması garantili bir tamsayıdır (veya uzun bir tamsayı). Örtüşmeyen yaşam süreleri olan iki nesne, aynı id() değerine sahip olabilir.

+0

çok güzel, bunu kazmaya çalıştığınız için teşekkürler –

İlgili konular