10

特定のデバッグ目的で、任意のオブジェクトのdel関数をラップして、オブジェクトの最後の値をファイルに書き込むなどの追加のタスクを実行したいと考えています。

理想的には、monkey(x) と書きたいと思います。これは、x が削除されたときに x の最終値が出力されることを意味する必要があります。

これで、 delはクラス メソッドであることがわかりました。したがって、次が始まりです。

class Test:
    def __str__(self):
        return "Test"

def p(self):
    print(str(self))

def monkey(x):
    x.__class__.__del__=p

a=Test()
monkey(a)
del a

ただし、特定のオブジェクトのみをモンキーしたい場合は、クラスを動的に新しいものに書き換える必要があると思いますか?! さらに、組み込み型のdelにアクセスできないため、とにかくこれを行う必要がありますか?

誰でもそれを実装する方法を知っていますか?

4

4 に答える 4

8

__del____str__、などの特別な「ダブル アンダースコア」メソッドはインスタンス レベルでモンキー パッチを適用できますが、直接__repr__呼び出されない限り無視されます(たとえば、Omnifarious の答えを受け取った場合: 何も出力されません)。 、しかしそうするでしょう)。del aa.__del__()

実行時にクラスの単一インスタンス にモンキー パッチを適用したい場合、解決策は から派生したクラスを動的に作成し、のクラスを新しく作成された に変更することです。はい、これは可能であり、何も変更されていないかのように動作します-サルのパッチが適用されたメソッドが含まれるようになったことを除いて。aAA1AaA1a

これは、別の質問のために私が書いた汎用関数に基づく解決策です: Python メソッド解決の謎

def override(p, methods):
    oldType = type(p)
    newType = type(oldType.__name__ + "_Override", (oldType,), methods)
    p.__class__ = newType


class Test(object):
    def __str__(self):
        return "Test"

def p(self):
    print(str(self))

def monkey(x):
    override(x, {"__del__": p})

a=Test()
b=Test()
monkey(a)
print "Deleting a:"
del a
print "Deleting b:"
del b
于 2011-05-15T19:50:21.577 に答える
1

del a名前空間から名前「a」を削除しますが、その名前で参照されるオブジェクトは削除しません。これを参照してください:

>>> x = 7
>>> y = x
>>> del x
>>> print y
7

また、some_object.__del__ が呼び出されることを保証するものではありません

また、私はすでにあなたの質問にここで答えました(ドイツ語)。

于 2011-05-15T19:54:47.363 に答える
0

また、いくつかの基本クラスから継承して__del__メソッドをオーバーライドすることもできます(その場合、必要なのは、オブジェクトを作成するときにクラスをオーバーライドすることだけです)。または、super組み込みのメソッドを使用できます。

于 2011-05-15T18:25:37.477 に答える
0

編集:これは実際には機能しません。主に他の人への警告としてここに残しておきます。

個々のオブジェクトにモンキーパッチを適用できます。selfこの方法でモンキーパッチを適用した関数には渡されませんが、。を使用すると簡単に修正できますfunctools.partial

例:

def monkey_class(x):
    x.__class__.__del__ = p

def monkey_object(x):
    x.__del__ = functools.partial(p, x)
于 2011-05-15T19:02:33.887 に答える