関数内にクラスインスタンスを定義すると、関数が終了すると、インスタンスはスコープ外のため自動的に破棄されます。これは、小さなプログラムで簡単に確認できます。
class A(object):
def __del__(self):
print 'deleting A ', id(self)
class B(A):
def __init__(self):
self.a = A()
def __del__(self):
print 'deleting B ', id(self)
super(B, self).__del__()
def test():
b = B()
print 'this is ', b
test()
出力は次のとおりです。
this is <__main__.B object at 0x01BC6150>
deleting B 29122896
deleting A 29122896
deleting A 29122960
しかし、私は奇妙な問題に遭遇しています。novaclient からクラスを継承すると、インスタンスが自動的に破棄されることはありません。
from novaclient.v1_1.client import Client as NovaClient
class ViviNovaClient(NovaClient):
def __init__(self, auth_token, url, tenant_id):
super(ViviNovaClient, self).__init__(None, None, tenant_id, auth_url = 'http')
self.client.management_url = url
self.client.auth_token = auth_token
self.client.used_keyring = True;
LOG.info('creating <ViviNovaClient> %d' % id(self))
def __del__(self):
LOG.info('deleting <ViviNovaClient> %d' % id(self))
if __name__ == '__main__':
def test():
client = ViviNovaClient('53ef4c407fed45de915681a2d6aef1ee',
'http://135.251.237.130:8774/v2/082d8fd857f44031858827d149065d9f',
'082d8fd857f44031858827d149065d9f')
test()
出力は次のとおりです。
2013-05-24 23:08:03 32240 INFO vivi.vivimain.ViviNovaClient [-] creating <ViviNovaClient> 26684304
このテストでは、「クライアント」オブジェクトは破棄されません。それで、「クライアント」オブジェクトが自動破棄されるのを防ぐのは何だろうか?