2016-11-25 4 views
0

私は変数にアクセスして制御したいです。 pyjackモジュールの助けを借りて実装しようとしましたが、pyjack.connect(my_str、proxyfn = my_proxyfn)メソッドは例外...type '<type 'str'>' not supportedをスローします。ここでPythonにはオブジェクトへのアクセスを傍受するメカニズムがありますか?

は、私が何をしたいの例です:

>>> def on_access(obj): 
... print 'object with id=%d has been requested' % id(obj) 
... 
>>> s = 'some string' 
>>> 
>>> foo(s, handler=on_access) 
>>> 
>>> print s 
object with id=4559856664 has been requested 
some string 
>>> 
>>> s + '.' 
object with id=4559856664 has been requested 
some string. 

UPD:オブジェクトがその型を保持することが重要です。例の続きで

>>> import json 
>>> 
>>> json.dumps(s) 
object with id=4559856664 has been requested 
'"some string"' 
+1

"アクセス"とは何を定義するのか、また定義しないのかを明確に定義できますか? – wim

+0

はい、投稿した例はあなたの質問を明確にするとは思わない。 –

+0

関数ラッパーが必要なように見えます。 'def s():print 'アクセス'; return 'some string''。 – TigerhawkT3

答えて

0

デリゲートが根底に呼び出すラッパークラスのいくつかの並べ替えを作成せずにこれを行う方法はありませんが、オブジェクトを「追跡しました」。

オブジェクトのすべての操作は、最終的にはそのダンダーの使用によって制御されます。 printは、例えば、__str__s + '.'を最初に呼び出し、__add__を呼び出し、サブスクリプトは__getitem__を呼び出します。これらの機能では、「アクセス時のアクセス」動作を定義する必要があります。

class Wrap(object): 

    access_str = "object with id={} has been accessed" 

    def __init__(self, obj): 
     self._obj = obj 

    def __add__(self, v): 
     print(self.access_str.format(self._obj)) 
     # If you want the result to be tracked 
     # return Wrap(self._obj + v) 
     return self._obj + v 


    def __repr__(self): 
     print(self.access_str.format(self._obj)) 
     return repr(self._obj) 

    def __str__(self): 
     print(self.access_str.format(self._obj)) 
     return str(self._obj) 

これは明らかに必要なメソッドの残りの部分を欠くですが、それはあなたが行くならば、あなたがやるべきものです:あなたの例の機能は次のようになります提示

A素早い基本的な書き込みアップこのルートを降りてください。これは明らかに、あなたは、その後に結合したいname引数の要件を強制することができ__init__、例えば、変更することができます

>>> s = Wrap("Hello World") 
>>> print(s) 
object with id=140023929394880 has been accessed 
Hello World 
>>> s + '.' 
object with id=140023929394880 has been accessed 
'Hello World.' 

:あなたは任意の文字列と同じように

は今、あなたはそれと対話しますglobals()を使用してグローバルスコープ。

さらに、タイプに応じて自動的に類似のダンダーメソッドを生成するメタクラスを作成できます。

ポイントは、これを行う組み込みの方法はありません、あなたはいくつか退屈な方法でそれを行う必要があります。

関連する問題