ホームページ  >  記事  >  バックエンド開発  >  Pythonクラスオブジェクトの破棄と解放の詳細な例

Pythonクラスオブジェクトの破棄と解放の詳細な例

WBOY
WBOY転載
2022-09-08 17:37:282312ブラウズ
#[関連する推奨事項:

Python3 ビデオ チュートリアル ]

1. クラスのコンストラクターとデストラクター

  • _init__ この関数は Python クラスのコンストラクターです。クラス オブジェクトを作成するときに、この関数は自動的に呼び出されます。この関数は、オブジェクトの作成時にオブジェクトの初期化情報と設定を設定するために使用できます。
  • __del__ この関数は Python クラスのデストラクターです。クラス オブジェクトのライフサイクルが終了して破棄されると、この関数は自動的に呼び出されます。主に一部のオブジェクトを解放するために使用されます。オブジェクトが占めるスペース、リソースなど。
2. コードデモ

1. 参照変更点

は以下の通りで、デモクラスの実装コードを記述します。

>>> 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; を出力します。

Use variables a2 は、別のデモ クラス オブジェクトを参照します。このとき、「init class」と、a2 変数によって参照されるオブジェクト アドレス

0x7f328f7c6d40;

が出力されます。 a1 変数と a2 変数によって参照されるクラス オブジェクトは、2 つの異なるオブジェクト

0x7f328f7c6cb00x7f328f7c6d40 です。

最後にデモ クラス オブジェクトを作成し、a1 変数を使用して再びそれを指します。このとき、a1 は新しいクラス オブジェクトを参照し、参照アドレスは

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 を定義します。この関数の機能は、デモ クラス オブジェクトを作成し、作成されたクラス オブジェクトを参照するために inst 変数を使用することです。

create_demo() 関数を 1 回呼び出すと、デモ オブジェクトがアドレス

0x7f328f7c6cb0

で作成されたことがわかります。その後、デモ オブジェクトはすぐに解放されます。これは、オブジェクトが有効なのは、 create_demo 関数のスコープに到達すると、関数は終了し、デモ オブジェクトはリサイクルされて解放されます。 create_demo() 関数を再度呼び出しても、現象は同じです: アドレス

0x7f328f7c6cb0

でデモ オブジェクトが作成され、デモ オブジェクトはすぐに解放されます。 3. 関数内で返されるクラス オブジェクト

>>> def return_demo():
...     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 ステートメント

True

を実行し、オブジェクト 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 を

None

にリセットします。この時点で、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
>>>

[関連する推奨事項:

Python3 ビデオ チュートリアル

]

以上がPythonクラスオブジェクトの破棄と解放の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。