Pythonの__del__メソッド:オブジェクトを破棄します

関数の__del __()メソッド:オブジェクトを破棄する
Pythonは__init __()メソッドを呼び出して現在のクラスのインスタンス化されたオブジェクトを作成し、__ del __()メソッドを使用してインスタンス化されたオブジェクトを破棄します。
実際、プログラムを作成するときに、前に作成したクラスインスタンス化オブジェクトが後続のプログラムで使用されなくなった場合は、適切な場所で手動で破棄して、占有しているメモリスペースを解放するのが最善です(プロセス全体が呼び出されます)ガベージコレクション(略称:GC))。

ほとんどの場合、Pythonには、使用する必要のないインスタンスオブジェクトを破棄できる自動ガベージコレクションメカニズムがあるため、Python開発者は手動でガベージコレクションを実行する必要はありません。

例1

# -*- coding:utf8 -*-class User:
def __init__(self):
print("=== 调用 __init__() 方法构造对象 ===")
def __del__(self):
print("调用__del__() 销毁对象,(对象占用的内存被回收)")
u1 = User()
print('#'*50)

演算結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有属性2.py
=== 调用 __init__() 方法构造对象 ===
##################################################
调用__del__() 销毁对象,(对象占用的内存被回收)
Process finished with exit code 0

注:上記のコードは、インタラクティブなPythonプログラミングで実行している場合は__del __()メソッドを呼び出さず、__ del __()を呼び出してオブジェクトを破棄することは出力されません(オブジェクトが占有するメモリはリサイクルされます)。以上。

結論:Pythonはプログラムの終了前に__del __()メソッドを呼び出してオブジェクトを自動的に破棄し、オブジェクトが占有していたメモリを解放します。印刷後の__del __()メソッド呼び出しの場所に注意してください。 ( '#' * 50)ステートメント。

例2

# -*- coding:utf8 -*-class User:
def __init__(self):
    print("=== 调用 __init__() 方法构造对象 ===")
def __del__(self):
    print("调用__del__() 销毁对象,(对象占用的内存被回收)")
u1 = User()
del u1
print('#'*50)

演算結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有属性2.py
=== 调用 __init__() 方法构造对象 ===
调用__del__() 销毁对象,(对象占用的内存被回收)
##################################################
Process finished with exit code 0

結論:オブジェクトを手動で削除してから、__ del __()メソッドを呼び出して、メモリオブジェクトを破棄し、メモリスペースを解放します。

例3

# -*- coding:utf8 -*-class User:
def __init__(self):
print("=== 调用 __init__() 方法构造对象 ===")
def __del__(self):
print("调用__del__() 销毁对象,(对象占用的内存被回收)")
u1 = User()
u2 = u1# 
del u1 # 从运行结果可以看出来,执行该语句没有调用 __del__()方法,而是在程序即将运行结束的时候,程序自动调用了__del__()方法,销毁了对象
print('#'*50)# print('\n')# del u2# print("*"*50)

演算結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/销毁对象3.py
=== 调用 __init__() 方法构造对象 ===
##################################################
调用__del__() 销毁对象,(对象占用的内存被回收)

Process finished with exit code 0

結論:実行結果から、ステートメントdelu1の実行は__del __()メソッドを呼び出しますが、すぐには実行されませんが、プログラムが終了しようとすると、プログラムは自動的に__del __()メソッドを呼び出します。 、メモリオブジェクトを破棄します。ここには、Pythonのガベージコレクションメカニズムが含まれます。
Pythonは、自動参照カウント(ARC(auto-refrence-count)と呼ばれる)を使用して、ガベージコレクションメカニズムを実装します。このメソッドの中心的な考え方は次のとおりです:各Pythonオブジェクトはカウンターで構成され、最初のPythonインスタンスオブジェクトのカウンター値は0です。インスタンスオブジェクトを参照する変数がある場合、カウンターの値はまた、1ずつ増加します。変数がインスタンスオブジェクトを参照解除すると、カウンターは1減少します。Pythonオブジェクトのカウンター値が0の場合、Pythonオブジェクトを参照する変数がないことを意味します。これは、プログラムがそれを必要としなくなったことを証明し、Pythonは自動的に__del __()メソッドを呼び出してそれをリサイクルします。

上記の3番目の例の分析:実際、u1インスタンスオブジェクトを構築するプロセスは2つのステップに分かれています。最初に、User()を使用してこのクラスの__init __()メソッドを呼び出し、このクラスのオブジェクトを構築します( Uの場合、カウンターは0)であり、作成されたインスタンスオブジェクト(U + 1のカウンター値)への参照として変数u1をすぐに使用します。これに基づいて、u1を参照する別のu2変数があります(実際には、User()を参照するのと同じです。このとき、Uのカウンターは+1です)。このとき、delu1ステートメントを呼び出すと次のようになります。 Cのカウンターが1だけ減少する(値の変更は1)ため、Cのカウンター値は0ではないため、Uは破棄されません(__del __()メソッドは実行されません)。

例4

# -*- coding:utf8 -*-class User:
def __init__(self):
print("=== 调用 __init__() 方法构造对象 ===")
def __del__(self):
print("调用__del__() 销毁对象,(对象占用的内存被回收)")
u1 = User()
u2 = u1del u1 # 从运行结果可以看出来,执行该语句没有调用 __del__()方法,而是在程序即将运行结束的时候,程序自动调用了__del__()方法,销毁了对象print('#'*50)
# print('\n')# del u2print("*"*50)

演算結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有属性2.py
=== 调用 __init__() 方法构造对象 ===
##################################################
**************************************************
调用__del__() 销毁对象,(对象占用的内存被回收)
Process finished with exit code 0

例5:

# -*- coding:utf8 -*-class User:
def __init__(self):
print("=== 调用 __init__() 方法构造对象 ===")
def __del__(self):
print("调用__del__() 销毁对象,(对象占用的内存被回收)")
u1 = User()
u2 = u1del u1 # 从运行结果可以看出来,执行该语句没有调用 __del__()方法,而是在程序即将运行结束的时候,程序自动调用了__del__()方法,销毁了对象print('#'*50)
print('\n')
del u2print("*"*50)

演算結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有属性2.py
=== 调用 __init__() 方法构造对象 ===
##################################################
调用__del__() 销毁对象,(对象占用的内存被回收)
**************************************************
Process finished with exit code 0

フォー例の5つの例2つのインスタンスの比較、我々は見つける:カウンタは、オブジェクトのこのインスタンスによって参照される参照カウンタを実行するために、nは、オブジェクトのインスタンスが回参照nはデルオブジェクトを自動的にマイナス1 、インスタンスオブジェクトのカウンタがゼロになると、クラスの__del __()メソッドが呼び出されて実行されます。カウンタがゼロでない場合、インスタンスオブジェクトの__del __()メソッドは実行されません。プログラムはまもなく終了します以前は、pythonインタープリターは自動的に__del __()メソッドを実行してオブジェクトを破棄していました。

おすすめ

転載: blog.csdn.net/weixin_48505120/article/details/107586395