1

クラス A: def __get(self): return self._x

 def __set(self, y):
  self._x = y

 def __delete_x(self):
  print('DELETING')
  del self._x

 x = property(__get,__set,__delete_x)

b = A()

# Here, when b is deleted, i'd like b.x to be deleted, i.e __delete_x()
# called (and for immediate consequence, "DELETING" printed)
del b
4

3 に答える 3

2

ステートメントのセマンティクスは、delここで必要なものに実際には向いていません。del bsimple は、Aインスタンス化したばかりのオブジェクトへの参照をローカル スコープ フレーム/ディクショナリから削除します。これにより、オブジェクト自体に対して何らかの操作が直接実行されることはありません。それがオブジェクトへの最後の参照であった場合、参照カウントがゼロになるか、ガベージ コレクタがサイクルを収集すると、オブジェクトの割り当てが解除される可能性があります。__del__オブジェクトにメソッドを追加するか、目的のアクションを実行するweakrefコールバックを追加することで、これを確認できます。

ただし、後者の 2 つのソリューションはどちらも優れたアイデアとは思えません。__del__メソッドは、ガベージ コレクターがオブジェクトに関連するサイクルを収集するのを防ぎます。また、weakref はこの問題に悩まされることはありませんが、どちらの場合も、奇妙な環境 (プログラムのシャットダウン中など) で実行している可能性があり、達成したいことを実行するのが難しくなる可能性があります。

正確なユースケースを拡張できる場合、目的の最終目標を達成するためのまったく異なるアプローチがある可能性がありますが、そのような一般的で限定的な例に基づいて推測することは困難です.

于 2010-02-02T00:24:47.830 に答える
1

クラスのインスタンスがなくなったときA(削除またはガベージ コレクションによるもの) を制御するには、 に特別なメソッドを実装でき__del__(self)ますAそのインスタンスの特定の属性がなくなったときにコードを関与させたい場合は、その属性を を持つラッパー クラスでラップするか__del__、ほとんどの場合、weakrefモジュールを使用することをお勧めします (ただし、すべての型が使用できるわけではありません)。弱い参照のターゲットになる可能性があるため、この場合にはラッピングも必要になる場合があります)。

可能であれば回避__del__することが一般的に望ましいです。これは、ガベージ コレクションに干渉し、循環参照がある場合に「メモリ リーク」が発生する可能性があるためです。

于 2010-02-02T00:20:03.973 に答える
0

それを行うための醜い方法は次のようになります:

def __del__(self):
    for x in dir(self.__class__):
        if type(getattr(self.__class__, x)) == property:
            getattr(self.__class__, x).fdel(self)
于 2010-02-02T01:13:13.247 に答える