私の Python クラスは __del__ メソッドを定義していますが、オブジェクトを削除するときに呼び出されません

WBOY
リリース: 2023-09-24 23:21:05
転載
1240 人が閲覧しました

私の Python クラスは __del__ メソッドを定義していますが、オブジェクトを削除するときに呼び出されません

__del__ は Python の魔法のメソッドです。これらの魔法のメソッドを使用すると、オブジェクト指向プログラミングで非常に巧妙なトリックを実装できるようになります。ダンダー法とも呼ばれます。これらのメソッドは、プレフィックスとサフィックスとして使用される 2 つのアンダースコア (__) によって識別されます。

Python では、__new__() を使用してオブジェクトを作成し、__init__() を使用してそれを初期化します。ただし、オブジェクトを破棄するには __del__() を使用します。

###例###

オブジェクトを作成して削除しましょう -

リーリー ###出力### リーリー ###理由###

ただし、クラスが __del__ を定義しているにもかかわらず、オブジェクトを削除するときにそれを呼び出さない場合は、多くの理由が考えられます -

del ステートメントは、必ずしも __del__()

を呼び出す必要はありません。単にオブジェクトの参照カウントをデクリメントし、それがゼロになった場合に __del__() を呼び出します。

  • __del__() メソッドはランダムに呼び出すことができます。 - データ構造に循環リンクが含まれている場合、参照カウントは決してゼロには戻りません。 Python はそのようなサイクルを検出するアルゴリズムを実行しますが、ガベージ コレクターはデータ構造への最後の参照が消えてからしばらくしてから実行される可能性があります。

  • ###問題を解く###

    修正は次のとおりです -

__del__() を直接呼び出さないでください

- _del__() は close() を呼び出す必要があり、close() は同じオブジェクトに対して複数回呼び出せるようにする必要があります。

  • 循環参照を回避する

    - 循環参照を回避するには、weakref モジュールを使用します。これにより、参照カウントを増やさずにオブジェクトを指すことができます。 Weakref モジュールは、クラス # のインスタンスを取得するために使用することもできます。

以上が私の Python クラスは __del__ メソッドを定義していますが、オブジェクトを削除するときに呼び出されませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!