コンストラクタはインスタンスオブジェクトが生成されたときに実行され、デストラクタはインスタンスオブジェクトの参照カウントがゼロになってガーベジコレクションによってメモリが回収されるときに実行されます。
以下を見て理解してください。
python
1>>> class Test:
2... def __init__(self):
3... print('コンストラクタ作動: id =', id(self))
4... def __del__(self):
5... print('デストラクタ作動: id =', id(self))
6...
7>>> atest = Test()
8コンストラクタ作動: id = 2162359799376
9>>> print("1: id(test) =", id(atest))
101: id(test) = 2162359799376
11>>> my_dict = {'test':atest}
12>>> print("2: id(my_dict['test']) =", id(my_dict['test']))
132: id(my_dict['test']) = 2162359799376
14>>> test = my_dict['test']
15>>> print("3: id(test) =", id(test))
163: id(test) = 2162359799376
17>>> del test
18>>> print("4: id(atest) =", id(atest))
194: id(atest) = 2162359799376
20>>> print("5: id(my_dict['test']) =", id(my_dict['test']))
215: id(my_dict['test']) = 2162359799376
22>>> del atest
23>>> print("6: id(my_dict['test']) =", id(my_dict['test']))
246: id(my_dict['test']) = 2162359799376
25>>> my_dict['test'] = 100
26デストラクタ作動: id = 2162359799376
test = my_dict['test'] ではTestクラスの新しいインスタンスは生成していません。
del test では、参照カウントが3から2に減るだけです。
そのあとのdel atestで参照カウントが1となり、my_dict['test'] = 100によって参照カウントが0になった時にデストラクタが作動します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/10 09:16