ホームページ  >  記事  >  バックエンド開発  >  私の Python クラスは __del__ メソッドを定義していますが、オブジェクトを削除するときに呼び出されません

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

WBOY
WBOY転載
2023-09-24 23:21:051262ブラウズ

私の 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 までご連絡ください。