ホームページ >バックエンド開発 >Python チュートリアル >Pythonクラスオブジェクトの破棄と解放の詳細な例
Python3 ビデオ チュートリアル ]
1. クラスのコンストラクターとデストラクター この関数は Python クラスのコンストラクターです。クラス オブジェクトを作成するときに、この関数は自動的に呼び出されます。この関数は、オブジェクトの作成時にオブジェクトの初期化情報と設定を設定するために使用できます。
この関数は Python クラスのデストラクターです。クラス オブジェクトのライフサイクルが終了して破棄されると、この関数は自動的に呼び出されます。主に一部のオブジェクトを解放するために使用されます。オブジェクトが占めるスペース、リソースなど。
>>> class demo(): ... def __init__(self): ... print("init class") ... print(self) ... def __del__(self): ... print("del class") ... print(self) ... >>>このタイプのオブジェクトが作成されると、
__init__ 関数が呼び出され、「init class」が出力されます;
このタイプのオブジェクトが破棄されると、
__del__ 関数を呼び出し、「del クラス」を出力します。
>>> a1 = demo() init class <__main__.demo instance at 0x7f328f7c6cb0> >>> >>> a2 = demo() init class <__main__.demo instance at 0x7f328f7c6d40> >>> >>> >>> >>> a1 = demo() init class <__main__.demo instance at 0x7f328f7c6d88> del class <__main__.demo instance at 0x7f328f7c6cb0> >>>まず、変数 a1 を使用してデモ クラス オブジェクトを参照します。このとき、「init class」と変数 a1 が参照するオブジェクト アドレス
0x7f328f7c6cb0;
を出力します。
0x7f328f7c6d40;
0x7f328f7c6cb0 と
0x7f328f7c6d40 です。
0x7f328f7c6d88 です。同時に、以前に a1 によって参照されていたオブジェクトが原因で ##0x7f328f7c6cb0
誰もそれを参照しなくなったため、古いデモ クラス オブジェクトのスペースが解放され、「del class 0x7f328f7c6cb0
」が印刷された。 2. 関数内のみのクラス オブジェクト
>>> def create_demo(): ... inst = demo() ... >>> create_demo() init class <__main__.demo instance at 0x7f328f7c6cb0> del class <__main__.demo instance at 0x7f328f7c6cb0> >>> >>> >>> >>> create_demo() init class <__main__.demo instance at 0x7f328f7c6cb0> del class <__main__.demo instance at 0x7f328f7c6cb0> >>> >>> >>> >>> create_demo() init class <__main__.demo instance at 0x7f328f7c6cb0> del class <__main__.demo instance at 0x7f328f7c6cb0> >>>
create_demo() 関数を 1 回呼び出すと、デモ オブジェクトがアドレス
0x7f328f7c6cb0 で作成されたことがわかります。その後、デモ オブジェクトはすぐに解放されます。これは、オブジェクトが有効なのは、 create_demo 関数のスコープに到達すると、関数は終了し、デモ オブジェクトはリサイクルされて解放されます。 create_demo() 関数を再度呼び出しても、現象は同じです: アドレス
でデモ オブジェクトが作成され、デモ オブジェクトはすぐに解放されます。 3. 関数内で返されるクラス オブジェクト
>>> def return_demo(): ... return demo() ...
>>> True True >>> return_demo() init class <__main__.demo instance at 0x7fc511eb8cb0> <__main__.demo instance at 0x7fc511eb8cb0> >>> >>> True del class <__main__.demo instance at 0x7fc511eb8cb0> True >>> >>> return_demo() init class <__main__.demo instance at 0x7fc511eb8cb0> <__main__.demo instance at 0x7fc511eb8cb0> >>> >>> >>> >>> True del class <__main__.demo instance at 0x7fc511eb8cb0> True >>> >>>
関数 return_demo() が初めて呼び出されたとき、出力される内容には、この時点でオブジェクトが作成され、オブジェクト アドレスが
0x7fc511eb8cb0 であることが示されていることがわかります。 return_demo 関数は内部的に使用されます return
ステートメントは作成されたクラス オブジェクトを返すため、関数が戻ってもオブジェクト 0x7fc511eb8cb0
は解放されません。 次に、Python ステートメント
を実行し、オブジェクト 0x7fc511eb8cb0
が解放されることを確認します。プログラムが return_demo() 関数を実行した後、後続のプログラムが return_demo() によって返されたオブジェクトを参照していないことが判明したため、Python はオブジェクト空間 0x7fc511eb8cb0
を解放します。 2度目に同じ操作を行っても同様の現象が見られます。
>>> v1_demo = None >>> v2_demo = None >>> print(v1_demo) None >>> print(v2_demo) None >>> True True >>> >>> v1_demo = return_demo() init class <__main__.demo instance at 0x7fc511eb8d88> >>> >>> print(v1_demo) <__main__.demo instance at 0x7fc511eb8d88> >>> >>> True True >>> >>> >>> v2_demo = return_demo() init class <__main__.demo instance at 0x7fc511eb8dd0> >>> >>> print(v2_demo) <__main__.demo instance at 0x7fc511eb8dd0> >>> True True >>> >>> >>> >>> >>> v1_demo = None del class <__main__.demo instance at 0x7fc511eb8d88> >>> >>> print(v1_demo) None >>>
このコード セグメントの現象は、前のコード セグメントの現象と基本的に同じです。
ご覧のとおり、v1_demo と v2_demo はクラス オブジェクトを参照しているため、v1_demo と v2_demo の値は
None ではなくなりました。 最後に、v1_demo を
にリセットします。この時点で、v1_demo によって参照されるオブジェクト 0x7fc511eb8d88
が解放されます。 1. グローバル変数を使用して関数内でクラス オブジェクトを参照する
>>> g_demo = None >>> print(g_demo) None >>> >>> def return_gdemo(): ... global g_demo ... g_demo = demo() ... >>> >>> print(g_demo) None >>> return_gdemo() init class <__main__.demo instance at 0x7fc511eb8d88> >>> >>> print(g_demo) <__main__.demo instance at 0x7fc511eb8d88> >>> >>> True True >>>
以上がPythonクラスオブジェクトの破棄と解放の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。